معالجة الاستثناءات
التكوين
config/exception.php
return [
// هنا يتم تكوين فئة معالجة الاستثناءات
'' => support\exception\Handler::class,
];
في وضعية التطبيقات المتعددة، يمكنك تكوين فئة معالجة الاستثناءات لكل تطبيق على حدة، راجع التطبيقات المتعددة.
فئة معالجة الاستثناءات الافتراضية
في Webman، يتم معالجة الاستثناءات افتراضيًا بواسطة فئة support\exception\Handler
. يمكنك تعديل ملف التكوين config/exception.php
لتغيير فئة معالجة الاستثناءات الافتراضية. يجب أن تقوم فئة معالجة الاستثناءات بتنفيذ واجهة Webman\Exception\ExceptionHandlerInterface
.
interface ExceptionHandlerInterface
{
/**
* سجل السجل
* @param Throwable $e
* @return mixed
*/
public function report(Throwable $e);
/**
* عرض الرد
* @param Request $request
* @param Throwable $e
* @return Response
*/
public function render(Request $request, Throwable $e) : Response;
}
عرض الاستجابة
طريقة render
في فئة معالجة الاستثناءات تُستخدم لعرض الاستجابة.
إذا كانت قيمة debug
في ملف التكوين config/app.php
هي true
(المشار إليها فيما بعد بـ app.debug=true
)، سيتم إرجاع معلومات استثناء مفصلة، وإلا فسوف يتم إرجاع معلومات استثناء مختصرة.
إذا كان الطلب يتوقع استجابة بصيغة json، فسيتم إرجاع معلومات الاستثناء بصيغة json، على غرار
{
"code": "500",
"msg": "معلومات الاستثناء"
}
إذا كانت app.debug=true
، سيتم إضافة حقل trace
بشكل إضافي إلى بيانات json لإرجاع مكدس الاستدعاء بالتفصيل.
يمكنك كتابة فئة معالجة استثناءات خاصة بك لتغيير منطق معالجة الاستثناءات الافتراضي.
استثناءات الأعمال BusinessException
أحيانًا نريد إنهاء الطلب في دالة متداخلة وإرجاع رسالة خطأ للعميل، يمكننا القيام بذلك عن طريق رفع BusinessException
.
على سبيل المثال:
<?php
namespace app\controller;
use support\Request;
use support\exception\BusinessException;
class FooController
{
public function index(Request $request)
{
$this->chackInpout($request->post());
return response('hello index');
}
protected function chackInpout($input)
{
if (!isset($input['token'])) {
throw new BusinessException('خطأ في المعلمات', 3000);
}
}
}
المثال أعلاه سيعيد
{"code": 3000, "msg": "خطأ في المعلمات"}
تنبيه
لا تحتاج استثناءات الأعمال BusinessException إلى التقاطها بواسطة try في الأعمال، حيث سيلتقطها الإطار تلقائيًا ويعيد الناتج المناسب بناءً على نوع الطلب.
استثناء الأعمال المخصص
إذا لم تتطابق الاستجابة أعلاه مع احتياجاتك، على سبيل المثال إذا كنت ترغب في تغيير msg
إلى message
، يمكنك تخصيص MyBusinessException
.
أنشئ ملفًا جديدًا app/exception/MyBusinessException.php
بالمحتوى التالي
<?php
namespace app\exception;
use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;
class MyBusinessException extends BusinessException
{
public function render(Request $request): ?Response
{
// إذا كان الطلب بصيغة json، يتم إرجاع بيانات json
if ($request->expectsJson()) {
return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
}
// إذا لم يكن الطلب بصيغة json، يتم إرجاع صفحة
return new Response(200, [], $this->getMessage());
}
}
بهذه الطريقة عند استدعاء الأعمال
use app\exception\MyBusinessException;
throw new MyBusinessException('خطأ في المعلمات', 3000);
سيستلم الطلب بصيغة json استجابة مشابهة كما يلي
{"code": 3000, "message": "خطأ في المعلمات"}
نصيحة
لأن استثناء BusinessException هو استثناء للأعمال (مثل خطأ في إدخال المستخدم للمعلمات)، فإنه يُعتبر استثناءً قابلًا للتوقع، لذا فإن الإطار لن يعتبره خطأً مميتًا ولن يسجل السجل.
ملخص
يمكنك التفكير في استخدام استثناء BusinessException
في أي وقت تحتاج فيه إلى إنهاء الطلب الحالي وإرجاع معلومات للعميل.