رسیدگی به خطا
معرفی
هنگامی که یک پروژه جدید لاراول را شروع می کنید، مدیریت خطا و استثنا از
قبل برای شما پیکربندی شده است.
کلاس
App\Exceptions\Handler
جایی است که تمام استثناهای ایجاد شده توسط برنامه شما ثبت می شوند و سپس به
کاربر ارائه می شوند.
ما در طول این مستندات عمیقتر به این کلاس خواهیم پرداخت.
پیکربندی
گزینه
debug
موجود در
config/app.php
فایل پیکربندی شما تعیین می کند که واقعاً چه مقدار اطلاعات در مورد یک خطا
به کاربر نمایش داده می شود.
به طور پیش فرض، این گزینه به گونه ای تنظیم شده است که به مقدار
APP_DEBUG
متغیر محیطی که در فایل شما ذخیره می شود، احترام بگذارد
.env
.
برای توسعه محلی، باید
APP_DEBUG
متغیر محیطی را روی
true
.
در محیط تولید شما، این مقدار باید همیشه باشد
false
.
اگر مقدار
true
در مرحله تولید تنظیم شده باشد، در معرض خطر قرار دادن مقادیر حساس پیکربندی
برای کاربران نهایی برنامه خود هستید.
کنترل کننده استثنا
روش گزارش
همه استثناها توسط
App\Exceptions\Handler
کلاس انجام می شود.
این کلاس شامل دو متد
report
و
render
.
هر یک از این روش ها را به تفصیل بررسی می کنیم.
این
report
روش برای ثبت استثناها یا ارسال آنها به یک سرویس خارجی مانند
Flare
،
Bugsnag
یا
Sentry
استفاده می شود .
به طور پیش فرض،
report
متد استثنا را به کلاس پایه ای که در آن استثنا ثبت شده است، ارسال می کند.
با این حال، شما آزاد هستید که استثناها را هر طور که می خواهید ثبت کنید.
برای مثال، اگر نیاز به گزارش انواع مختلف استثناها به روش های مختلف دارید،
می توانید از
instanceof
عملگر مقایسه PHP استفاده کنید:
/** * Report or log an exception. * * This is a great spot to send exceptions to Flare, Sentry, Bugsnag, etc. * * @param \Throwable $exception * @return void */public function report(Throwable $exception){ if ($exception instanceof CustomException) { // } parent::report($exception);}
به جای بررسی های زیاد
instanceof
در روش خود ، از استثناهای قابل گزارشreport
استفاده کنید
زمینه ثبت جهانی
اگر در دسترس باشد، لاراول به طور خودکار شناسه کاربر فعلی را به عنوان داده
های متنی به پیام گزارش هر استثنا اضافه می کند.
شما می توانید داده های متنی جهانی خود را با نادیده گرفتن
context
روش کلاس برنامه خود تعریف کنید
App\Exceptions\Handler
.
این اطلاعات در هر پیام گزارش استثنایی که توسط برنامه شما نوشته شده است
گنجانده می شود:
/** * Get the default context variables for logging. * * @return array */protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]);}
یاور
report
_
گاهی اوقات ممکن است لازم باشد یک استثنا را گزارش کنید اما به رسیدگی به
درخواست فعلی ادامه دهید.
تابع
report
کمکی به شما امکان میدهد تا با استفاده از روش کنترلکننده استثنا،
report
بدون ارائه صفحه خطا، به سرعت یک استثنا را گزارش کنید:
public function isValid($value){ try { // Validate the value... } catch (Throwable $e) { report($e); return false; }}
نادیده گرفتن استثناها بر اساس نوع
ویژگی
$dontReport
کنترل کننده استثنا شامل آرایه ای از انواع استثنا است که ثبت نمی شوند.
به عنوان مثال، استثناهای ناشی از خطاهای 404، و همچنین چندین نوع دیگر از
خطاها، در فایل های گزارش شما نوشته نمی شوند.
در صورت نیاز می توانید انواع استثناهای دیگری را به این آرایه اضافه کنید:
/** * A list of the exception types that should not be reported. * * @var array */protected $dontReport = [ \Illuminate\Auth\AuthenticationException::class, \Illuminate\Auth\Access\AuthorizationException::class, \Symfony\Component\HttpKernel\Exception\HttpException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Validation\ValidationException::class,];
روش رندر
این
render
متد مسئول تبدیل یک استثنا به یک پاسخ HTTP است که باید به مرورگر ارسال
شود.
به طور پیش فرض، استثنا به کلاس پایه ارسال می شود که برای شما پاسخ ایجاد
می کند.
با این حال، شما آزاد هستید که نوع استثنا را بررسی کنید یا پاسخ سفارشی خود
را برگردانید:
/** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Throwable $exception * @return \Illuminate\Http\Response */public function render($request, Throwable $exception){ if ($exception instanceof CustomException) { return response()->view('errors.custom', [], 500); } return parent::render($request, $exception);}
استثناهای قابل گزارش و اجرا
به جای استثناهای بررسی نوع در کنترل کننده ها
report
و
render
متدهای استثنا، می توانید
مستقیماً روی استثنای سفارشی خود
report
و متدهایی را تعریف کنید.
render
هنگامی که این متدها وجود داشته باشند، آنها به طور خودکار توسط فریمورک
فراخوانی می شوند:
<?php namespace App\Exceptions; use Exception; class RenderException extends Exception{ /** * Report the exception. * * @return void */ public function report() { // } /** * Render the exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function render($request) { return response(...); }}
میتوانید وابستگیهای مورد نیاز متد را تایپ کنید و آنها به طور خودکار توسط کانتینر سرویس
report
لاراول به متد تزریق میشوند .
استثناهای HTTP
برخی استثناها کدهای خطای HTTP را از سرور توصیف می کنند.
به عنوان مثال، این ممکن است یک خطای "صفحه یافت نشد" (404)، یک "خطای
غیرمجاز" (401) یا حتی یک خطای 500 توسط توسعه دهنده باشد.
برای ایجاد چنین پاسخی از هر نقطه در برنامه خود، می توانید از
abort
راهنما استفاده کنید:
abort(404);
کمک
abort
کننده بلافاصله استثنایی را مطرح می کند که توسط کنترل کننده استثنا ارائه
می شود.
در صورت تمایل، می توانید متن پاسخ را ارائه دهید:
abort(403, 'Unauthorized action.');
صفحات خطای سفارشی HTTP
لاراول نمایش صفحات خطای سفارشی برای کدهای وضعیت HTTP مختلف را آسان می
کند.
به عنوان مثال، اگر می خواهید صفحه خطا را برای کدهای وضعیت HTTP 404 سفارشی
کنید، یک
resources/views/errors/404.blade.php
.
این فایل در مورد تمام خطاهای 404 ایجاد شده توسط برنامه شما ارائه می شود.
نماهای موجود در این فهرست باید به گونه ای نامگذاری شوند که با کد وضعیت
HTTP مطابقت دارند.
نمونه ای
HttpException
که توسط
abort
تابع مطرح می شود به عنوان یک متغیر به view ارسال می شود
$exception
:
<h2>{{ $exception->getMessage() }}</h2>
شما می توانید قالب های صفحه خطای لاراول را با استفاده از
vendor:publish
دستور Artisan منتشر کنید.
پس از انتشار قالب ها، می توانید آنها را به دلخواه شخصی سازی کنید:
php artisan vendor:publish --tag=laravel-errors