
زمانی که یک مسیر (Route) را فراخوانی میکنیم و آن مسیر وجود ندارد، به طور پیشفرض در لاراول اگر debug آن را در فایل env. فعال کرده باشید، یک صفحه خطا به شما نمایش داده میشود، که به طور دقیق نشان میدهد، که مسیر وجود ندارد، و مشکلات را بیان میکند. در این حالت یک اتفاق میافتد، که به آن خطای 404 یا not found میگوییم. حال اگر در فایل env. دیباگ را غیرفعال کنید، یک صفحه سفید ساده نشان میدهد، که وسط آن Not Found نوشته شده است. تمام استثنائات PHP، کلاس Exception ابتدایی را توسعه میدهد. فریم ورک لاراول کلاس app/Exceptions/Handler.php را فراهم میکند که تمام استثنائاتی که در اپلیکیشن رخ میدهد را مورد بررسی قرار میدهد. اساسا هر استثنائی که در اپلیکیشن رخ میدهد را میتوان در این فایل پیکربندی کرد و به یک پاسخ مناسب دست یافت. در این مقاله به آموزش ساخت صفحه 404 در لاراول میپردازیم، و میخواهیم یک صفحهی سفارشی را در حالتهای برخورد با خطا بسازیم.
فهرست محتوای این مقاله
نصب پروژهی لاراول
برای ایجاد یک پروژه لاراول جدید، دستور زیر را اجرا کنید تا یک پروژه جدید به نام errors ایجاد کنید.
composer create-project --prefer-dist laravel/laravel errors
Handling exceptions
تمام تغییرات مربوط به مدیریت استثنائات در app/Exceptions/Handler.php انجام خواهد شد. و وقتی یک خطا رخ میدهد، یک view را باز خواهیم گرداند.
خطای 404
در اینجا یک خطای 404 را در فریم ورک لاراول درست میکنیم. در فایل app/Exceptions/Handler.php ، متد رندر را به صورت زیر تغییر دهید.
/** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { if ($this->isHttpException($exception)) { if ($exception->getStatusCode() == 404) { return response()->view('errors.' . '404', [], 404); } } return parent::render($request, $exception); }
در متد رندر، بررسی میکنیم که آیا استثنا یک HTTP exception می باشد یا خیر. به این دلیل که ما متد get Status Code() را فرامیخوانیم که فقط در HTTP exceptions در دسترس میباشد، این بررسی مهم است. اگر کد وضعیت عدد 404 است، ما errors.404 را با کد وضعیت نیز بازمیگردانیم. اگر بخواهید میتوانید نام view را نیز تغییر دهید.
باید یک view برای ارور 404 ایجاد کنید. بنابراین یک فایل view جدید resource/views/errors/404.blade.php درست کنید.
<!DOCTYPE html> <html> <head> <title>Page not found - 404</title> </head> <body> The page your looking for is not available </body> </html>
اگر میخواهید یک پیج مرسوم برای هر HTTP exception دیگر بسازید، فقط کافی است یک if اضافه کنید و 404 را با کد جدید تعویض کنید.
public function render($request, Exception $exception) { if ($this->isHttpException($exception)) { if ($exception->getStatusCode() == 404) { return response()->view('errors.' . '404', [], 404); } if ($exception->getStatusCode() == 500) { return response()->view('errors.' . '500', [], 500); } } return parent::render($request, $exception); }
صفحات HTTP Exceptions
ما میتوانیم این فرایند را خودکار کنیم. اگر میتوانستیم فقط یک فایل view جدید برای استثنا ایجاد کنیم عالی بود. دیگر نیازی نبود برای هر HTTP exception یک کد به app/Exceptions/handler.php اضافه کنیم. در app/Exceptions/Handler.php متد رندر را اصلاح کنید.
public function render($request, Exception $exception) { if ($this->isHttpException($exception)) { if (view()->exists('errors.' . $exception->getStatusCode())) { return response()->view('errors.' . $exception->getStatusCode(), [], $exception->getStatusCode()); } } return parent::render($request, $exception); }
حالا شما باید با Status code استثنا یک view درست کنید. متد رندر بررسی میکند که آیا View در status code استثنا وجود دارد یا خیر. اگر view حاضر است، به سادگی یک HTTP response را با آن View و status code بازمی گرداند.
برای مثال ما میتوانیم errors/404.blade.php را برای خطای 404 و errors/500.blade.php را برای خطای 500 بسازیم.
مدیریت استثنائات مرسوم
بیاید ابتدا یک Custom exception ایجاد کنیم. کد زیر را اجرا کنید تا یک استثنا با نام Testing HttpException ایجاد کنید.
برای ایجاد یک استثنا دستور زیر را در خط فرمان خود اجرا کنید.
php artisan make:exception TestingHttpException
حال میتوانید متد render در فایل app/Exceptions/Handler.php را به صورت زیر تغییر دهید.
public function render($request, Exception $exception) { if ($exception instanceof Testing HttpException) { return response()->view('errors.testing'); } return parent::render($request, $exception); }
در کد بالا در شرط اول گفتیم که اگر استثنا یک شی از مدل Testing HttpException بود، پس یک view برمیگرداند.
میتوانید از این تکنیک برای مدیریت تمام استثنائات استفاده کنید.
جمعبندی:
در این مقاله بخشی از مدیریت استثناها (Exception) را بررسی کردیم به آموزش ساخت صفحه 404 در لاراول پرداختیم، و توانستیم دو خطای 404 و 500 را سفارشی کنیم یعنی در موقع اتفاق افتادن این خطاها فایل view سفارشی خود را ساختیم. میتوانید فایل viewای که ساختیم را زیباتر و با استایل طراحی کنید که این به سلیقهی شما مربوط است. همچنین در مرحلهی بعد یک استثنا سفارشی خود را ساختیم و گفتیم زمانی که استثنا از این نوع بود عملیاتی را اجرا کند.
اگر به یادگیری بیشتر لاراول علاقه داری میتوانی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
بدون این کد هم میشه ساخت.
من فقط یه فولدر errors اضافه کردم و یک blade.404 که خود لاراول آوردش.