【问题标题】:Creating a custom exception class and custom handler class in Laravel 5.3在 Laravel 5.3 中创建自定义异常类和自定义处理程序类
【发布时间】:2016-11-10 09:05:10
【问题描述】:

在我开始编写代码之前,让我解释一下我的目标。我的网络应用程序显示待售车辆。如果用户尝试访问不存在的页面,我需要一个自定义 404 页面,该页面将显示添加到数据库中的 12 辆最新车辆。

我有以下...

App\Exceptions\CustomException.php

<?php

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    public function __construct()
    {
        parent::__construct();
    }
}

App\Exceptions\CustomHandler.php

<?php
namespace App\Exceptions;

use Exception;
use App\Exceptions\Handler as ExceptionHandler;
use Illuminate\Contracts\Container\Container;
use App\Project\Frontend\Repo\Vehicle\EloquentVehicle;
use Illuminate\Foundation\Exceptions\Handler;
use Illuminate\Support\Facades\View;

class CustomHandler extends ExceptionHandler
{
    protected $vehicle;

    public function __construct(Container $container, EloquentVehicle $vehicle)
    {
        parent::__construct($container);

        $this->vehicle = $vehicle;
    }

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * 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)
    {
        $exception = Handler::prepareException($exception);

        if($exception instanceof CustomException) {
            return $this->showCustomErrorPage();
        }

        return parent::render($request, $exception);
    }

    public function showCustomErrorPage()
    {
        $recentlyAdded = $this->vehicle->fetchLatestVehicles(0, 12);

        return View::make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
    }
}

为了测试这个我添加了

抛出新的 CustomException();

到我的控制器,但它没有调出 404Custom 视图。我需要做些什么才能使其正常工作?

更新:只是给任何将他们的类绑定到他们的模型的人的注释。如果您尝试使用以下方法访问类中的函数,您将收到 BindingResolutionException:

app(MyClass::class)->functionNameGoesHere();

要解决这个问题,只需创建一个变量,就像将类绑定到服务提供者中的容器一样。

我的代码如下所示:

protected function showCustomErrorPage()
{
    $eloquentVehicle = new EloquentVehicle(new Vehicle(), new Dealer());
    $recentlyAdded = $eloquentVehicle->fetchLatestVehicles(0, 12);

    return view()->make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
}

阿米特的版本

protected function showCustomErrorPage()
{
    $recentlyAdded = app(EloquentVehicle::class)->fetchLatestVehicles(0, 12);

    return view()->make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
}

【问题讨论】:

    标签: laravel laravel-5 exception


    【解决方案1】:

    第 1 步:创建自定义异常

    php artisan make:exception CustomException

    第 2 步:在您的代码中包含该异常

    use App\Exceptions\CustomException;

    将您的错误传递给该异常

    if($somethingerror){
      throw new CustomException('Your error message');          
    }
    

    第 3 步:report()render() 方法中处理 CustomException 文件中的异常

    例如,如果我想将错误显示为 JSON 格式

    <?php
    namespace App\Exceptions;
    use Exception;
    class CustomException extends Exception
    {   
        public function render($request)
        {       
            return response()->json(["error" => true, "message" => $this->getMessage()]);       
        }
    }
    

    【讨论】:

      【解决方案2】:

      在新版本的 Laravel 中,您可以使用以下命令创建自定义处理程序:

      php artisan make:exception CustomException
      

      然后您应该在您的自定义处理程序中调用这些方法“report()render()”,它们将覆盖App\Exceptions\Handler 中的现有方法。

      report() 用于记录错误。

      render() 如果你想重定向返回错误或返回 HTTP 响应(如你自己的 Blade 文件)或者如果你正在构建一个 API。

      更多信息,您可以查看Laravel documentation

      【讨论】:

        【解决方案3】:

        Laravel 调用 App\Exceptions\Handler 类的 render 函数。所以覆盖它是行不通的。

        您必须将其添加到 App\Exceptions\Handler 类中。

        例如:

        <?php
        
        namespace App\Exceptions;
        
        use Exception;
        use Illuminate\Auth\AuthenticationException;
        use App\Project\Frontend\Repo\Vehicle\EloquentVehicle;
        use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
        
        class Handler extends ExceptionHandler
        {
            /**
             * 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\Session\TokenMismatchException::class,
                \Illuminate\Validation\ValidationException::class,
            ];
        
            /**
             * Report or log an exception.
             *
             * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
             *
             * @param  \Exception  $exception
             * @return void
             */
            public function report(Exception $exception)
            {
                parent::report($exception);
            }
        
            /**
             * 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($exception instanceof CustomException) {
                    return $this->showCustomErrorPage();
                }
        
                return parent::render($request, $exception);
            }
        
            protected function showCustomErrorPage()
            {
                $recentlyAdded = app(EloquentVehicle::class)->fetchLatestVehicles(0, 12);
        
                return view()->make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
            }
        }
        

        【讨论】:

        • 如果您通过为自己构建供应商包来重用大量代码,那么创建自己的 Handler 类并从 project/bootstrap/app.php 引用它可能会有所帮助。这样您就可以将所有代码保存在包中,并使用 Composer 分发您的更新。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2014-05-06
        相关资源
        最近更新 更多