تفاوت متد report و render در اکسپشن‌های لاراول

باسلام و درود خدمت تمامی علاقه مندان دنیای لاراول، این اولین پست من در جامعه توسعه دهنده‌‌گان لاراول می باشد، متاسفانه به نظر من برنامه نویس های PHP که حالا روی فریمورک هایی مثل Laravel کار میکنند خیلی مظلوم هستند.

دنیای php در ایران کلا community های تخصصی زیادی رو ندارد، و براساس صحبتی که با دوستانم داشتیم به نظرمان رسید که بهتر است که community تخصصی رو برای برنامه نویسان لاراول در ایران ایجاد کنیم و خیلی اتفاق دیگر که بعدا در خصوص خواهم نوشت.

تفاوت متد Report و Render در اکسپشن‌های لاراول

اما در این پست میخواهم در خصوص Exception های لاراول خیلی کوتاه توضیح بدهم و بعد تخصصی تر هدفم این هست که در خصوص متد های Report و Render به شما توضیح بدهیم، پس در ادامه با من همراه باشید

laravel exception
laravel exception

در لاراول یکی از مباحث مهم بحث (مدیریت خطاها - Exception Handling) هست که لاراول برای مدیریت خطاها از Exception ها یا به فارسی (استثناها) استفاده می کنه، شما با استفاده از Exception ها میتوانید خطاهای خودتون رو کنترل کنید، در خصوص اکسپشن ها من سعی میکنم در آینده پستی رو بنویسم و کامل در خصوص آن توضیح بدهم

تفاوت متد Report و Render :

اما بپردازیم به تفاوت بین متد Render و Report در لاراول :

همان طور که گفتیم خطاها در لاراول با استفاده از اکسپشن‌ها ها مدیریت می‌شوند ، این مدیریت توسط کلاس : App\Exceptions\Handler.php انجام می شود ، این کلاس متد های مختلفی رو دارد که دوتا از مهم ترین متد هایی که دارد متد report و Render هست.

متد Report :

متد Report در واقع برای لاگ کردن استفاده میشود و هیچ پیامی رو برنمیگرداند ، و حتی شما میتوانید از این متد برای ارسال خطاها به یک سرویس خارجی هم استفاده کنید، مثلا میتوانید کاری کنید که وقتی خطایی ایجاد میشود با این متد یک ایمیل و یا پیامکی رو برای فرد خاصی ارسال کنید .

public function report(Exception $exception)
{
    parent::report($exception);
}

به صورت پیشفرض در Handler.php تمامی خطاها با استفاده از همین کلاس لاگ می شوند .

برای این که بهتر این موضوع رو درک کنید من چند نمونه کد در اختیارتون قرار میدهم :

Route::get('/u/{id}', function($id)
{
    return User::find($id)->id;
});

فرضا اگر یوزر با ای دی 1 داشته باشید بدون هیچ خطایی ای دی کاربر باربر به شما نمایش داده میشه ولی وقتی کاربر 1052 رو نداشته باشید خطا به شما نمایش داده میشود که این خطا توسط همین متد Report داره مدیریت میشه .

اگر دوست دارید دقیقا از کار این متد سر دربیارید مثلا شما میتوانید ErrorException رو در report محدود کنید این کارو به دو روش میتوانید انجام دهید :

روش اول :

public function report(Exception $exception)
    {
        parent::report($exception);
    }

کد فوق رو میتوانیم به کد زیر تغییر دهیم :

public function report(Exception $exception)
    {
      if(!$exception instanceof ErrorException ){
            parent::report($exception);
       }
    }

فقط یادتون باشه :

use ErrorException; 

رو قرار بدهید

با این کار مثلا خطاهای E_NOTICE نمایش داده نخواهد شد

روش دوم :

که خیلی ساده تر هست میتوانید از کد زیر استفاده کنید :

protected $dontReport = [
    ErrorException::class,
];

ما یک متغیر داریم به نام dontReport که داخلش هر کلاسی رو قرار بدهید داخل ریپورت ها لاگ نمیشه

متد Render :

اما بپردازیم به متد Render و کارهایی که باهاش میشه کرد، شما با استفاده از متد Render میتوانید پیغامی رو برگردانید، بزارید کد اولیه مون رو :

Route::get('/u/{id}', function($id)
{
    throw new NotFoundUserException();
    return User::find($id)->id;
});

به صورت فوق تغییر بدهیم ، من کد زیر رو به کد اولیم اضافه کردم :

   throw new NotFoundUserException();

که اگر یوزر مد نظرم رو پیدا نکرد، اکسپشن NotFoundUserException وارد عمل بشه و خطاها رو مدیریت کنه ، برای این کار فقط باید اول NotFoundUserException رو بسازید :

برای این کار میتوانید از دستور زیر استفاده کنید :

php artisan make:exception NotFoundUserException --render

که اکسپشن مورد نظر ساخته بشه و بعد میتوانید از آن برای مدیریت خطا در صورتی که کاربر پیدا نشد استفاده کنید

وقتی به مسیر App\Exceptions\NotFoundUserException.php بروید :

<?php

namespace app\Exceptions;

use Exception;

class NotFoundUserException extends Exception
{
    /**
     * Render the exception as an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        // uour code
    }
}

چنین کدی رو خواهید داشت، در بخش render میتوانید کد مورد نظر تون رو قرار بدهید، مثلا :

public function render($request)
{
    return response()->json([
        'status' => 0,
        "massege" => "کاربر پیدا نشد"
    ], 400);
}

با کد فوق میتوانید به کاربر در صورت پیدا نشدن پیغامی رو نمایش دهید . یا حتی میتوانید یک view برگردانید، البته که این مبحث ، مبحط طولانی هست و من در آینده سعی خواهم کرد در این خصوص ویدیویی هم بسازم که شما را در این خصوص بیشتر راهنمایی کنم

امیدوارم که از این مقاله لذت برده باشید.

حالا که تا اینجا اومدید این مقالات رو هم بخونید :

اشتباهات رایج در طراحی دیتابیس - قسمت اول

گواهینامه SSl رایگان یا پولی مسئله این است؟!

مرگ تدریجی وردپرس !

پایتون یا پی‌اچ‌پی؟ - قسمت اول

بهترین نرم افزار مدیریت پروژه در سال 98 ؟!