پرش به محتوای اصلی
لینوکس

آموزش مدیریت خطا و لاگ در لاراول (error handling) | Exception در لاراول

Ali Majidi Ali Majidi — دقیقه مطالعه ۵,۲۳۱ بازدید
آموزش مدیریت خطا و لاگ در لاراول (error handling) | Exception در لاراول
گاهی اوقات ممکن است در حین کدنویسی دچار مشکلاتی شوید، یکی از این مشکلات این است که شما نمی توانید رفتار کاربر را پیش بینی کنید و بنابراین کاربر ممکن است مشکلاتی را برای برنامه و اپلیکیشن شما پیش بیاورد و در صورتی که برای حل این مشکلات راه حل درستی نداشته باشید، اپلیکیشن شما به راحتی آسیب های بزرگی می بیند. استفاده از Exception ها در لاراول باعث می شود تا بتوانید رفتار های غیر معمولی کاربران اپلیکیشن خود را کنترل کنید و برای آن ها راه حل های مناسبی داشته باشید. در صورتی که از این Exception ها در لاراول استفاده نکنید ممکن است خطاهایی ناخواسته و ناگهانی در اپلیکیشن شما رخ دهد که باعث می شود Debug کردن و مدیریت خطاهای اپلیکیشن برای شما بسیار سخت شود. در این مقاله به آموزش مدیریت خطا در لاراول می پردازیم.

مقدمه ای بر Exception ها

هنگامی که یک پروژه ی جدید Laravel را شروع می کنید، مدیریت خطا و Exception ها در لاراول از قبل برای شما Config شده است. کلاس App\Exceptions\Handler همان جایی است که تمام Exception های برنامه ی شما log می شود و سپس برای کاربر نمایش داده می شود. در ادامه به صورت دقیق تر به این موضوع می پردازیم.

کانفیگ ها

قسمتی به نام debug در فایل config/app.php تعیین می کند که در واقع چه مقدار اطلاعاتی را در مورد یک خطا می خواهید به کاربر نمایش دهید. به طور پیش فرض، این Option همان مقداری را دارد که مقدار متغیر APP_DEBUG در فایل env. دارا می باشد. برای local development یا توسعه محلی، باید مقدار متغیر APP_DEBUG را true و برای production environment یا همان محیط اصلی که در دید کاربران قرار دارد، این مقدار را false بگذارید. اگر این مقدار در production environment برابر با true باشد، کاربران می توانند به اطلاعات حساس و مهمی از برنامه ی شما دسترسی پیدا کنند.

مدیریت Exception ها

تمام Exception ها در لاراول توسط کلاس App\Exceptions\Handler که شامل دو متد report و render می باشد، مدیریت می شوند.   در ادامه به جزییات این دو متد، یعنی متد report و render می پردازیم.

متد Report

از متد report برای ثبت log های Exception ها یا ارسال آن ها به یک سرویس خارجی مانند Flare ,Bugnag یا Sentry استفاده می شود. به طور پیش فرض، متد Exception ,report ها را به کلاس پایه (کلاسی که Exception ها در آن log می شوند) منتقل می کند. با این حال، شما می توانید Exception ها را هر جای دیگری که می خواهید log کنید. به طور مثال، اگر بخواهید انواع مختلفی از Exception ها را با روش های مختلفی report کنید، می توانید به شکل زیر از instanceof استفاده کنید.
/**
 * 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);
}

متن log برای Exception ها

Laravel به طور خودکار برای هر کاربر، شناسه یا همان id کاربر را به متن log های Exception هایی که کاربر با آن ها مواجه می شود اضافه می کند. شما می توانید برای لاگ در لاراول این متن را همان گونه که می خواهید در متد context از کلاس App\Exceptions\Handler بازنویسی یا Override کنید.
/**
 * Get the default context variables for logging.
 *
 * @return array
 */
protected function context()
{
    return array_merge(parent::context(), [
        'foo' => 'bar',
    ]);
}

Report Helper

گاهی اوقات می خواهید پس از اینکه یک Exception را report کردید، به مدیریت Request ها ادامه دهید و از آنها خارج نشوید. تابع report helper به شما این امکان را می دهد که یک Exception را با استفاده از متد report از handler، بدون این که یک صفحه ی ارور render شود، به سرعت report کنید.
public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Throwable $e) {
        report($e);

        return false;
    }
}

نادیده گرفتن برخی از Exception ها

Property به نام dontReport$ شامل type هایی از Exception هاست که نمی خواهیم از آن ها log گرفته شود.
/**
 * 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

متد render وظیفه ی تبدیل یک Exception داده شده به HTTP Response که باید به مرورگر ارسال شود را دارد. به طور پیش فرض، متد Exception ,render ها را به کلاس پایه (کلاسی که response را برای شما ایجاد می کند) منتقل می کند.
/**
 * 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 بودن یک Exception

شما می توانید علاوه بر بررسی نوع Exception ها در متد report یا render توسط Exception Handler ها، این متد ها را مستقیماً برای Exception دلخواه خود تعریف کنید. لازم به ذکر است که این متد ها زمانی که وجود داشته باشند، به طور خودکار توسط فریم ورک فراخوانی می شوند.
<?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(...);
    }
}

HTTP Exception ها

بعضی از Exception ها کدهای HTTP Error را از سرور توصیف می کنند. به عنوان مثال ، خطاهای "page not found" یا error 404، خطای unauthorized یا error 401 را در نظر بگیرید. مدیریت خطا در لاراول به منظور ایجاد چنین Response هایی از هر جای برنامه ی خود، می توانید از abort helper استفاده کنید.
abort(404);
abort helper بلافاصله یک Exception که توسط Exception Helper ارائه (render) می شود را نمایان می کند. شما می توانید به صورت کاملا اختیاری، متن Response را به دلخواه وارد کنید.
abort(403, 'Unauthorized action.');

صفحه ی HTTP Error سفارشی

Laravel نمایش صفحات سفارشی error را برای کدهای مختلف HTTP بسیار آسان کرده است. به طور مثال، اگر می خواهید صفحه ی error 404 را سفارشی سازی کنید، می توانید یک resources/views/errors/404.blade.php ایجاد کنید. این فایل روی تمام ارور های 404 ایجاد شده توسط برنامه ی شما اعمال می شود. View های داخل این Directory باید برای مطابقت با کدهای HTTP، حتما نام گذاری شوند. در نهایت instance یا همان نمونه ی HttpException که توسط تابع abort مطرح شده است به عنوان یک متغیر exception$ به View ارسال می شود.
<h2>{{ $exception->getMessage() }}</h2>
شما می توانید template های صفحه ی ارور Laravel را با استفاده از vendor:publish منتشر کنید. پس از منتشر شدن template ها، می توانید آنها را به صورت دلخواه خود تنظیم کنید.
php artisan vendor:publish --tag=laravel-errors
جمع بندی : همان طور که در ابتدا گفتیم شما نمی توانید رفتار کاربر را پیش بینی کنید و بنابراین کاربر ممکن است مشکلاتی را برای برنامه و اپلیکیشن شما پیش بیاورد که جبران برخی از این مشکلات و مدیریت خطاها بسیار زمان بر و دشوار است. پس بهتر است که در همان ابتدا راه حل درستی برای این مشکلات در نظر بگیریم. به همین علت است که مدیریت خطا در لاراول نقش بسیار مهمی در امنیت اپلیکیشن یا سایت ما دارد.
اگر به یادگیری بیشتر لاراول علاقه دارید می توانید در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه ها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
اشتراک‌گذاری:
۲ دیدگاه
Ali Majidi
نویسنده Ali Majidi
۵

دیدگاه‌ها

۱ نفر تجربه‌شان را نوشته‌اند.

۱۴۰۲/۵/۲۵

خیلی برام مفید بود ممنون ازتون