在Laravel 5.3中创建自定义异常类和自定义处理程序类

s4chpxco  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(150)

在我讲代码之前,让我解释一下我的目标。我的网络应用程序显示销售的车辆。我有一个自定义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);
    }
}

为了测试这一点,我添加了
throw new CustomException();
我的控制器,但它不会带来404自定义视图。我要怎么做才能让它工作?

更新:只是给任何将类绑定到模型的人的一个说明。如果你试图使用以下方法访问类中的函数,你会得到BindingResolutionException:
app(MyClass::class)->functionNameGoesHere();

要解决这个问题,只需以将类绑定到服务提供程序中的Container的相同方式创建一个变量。
我的代码如下所示:

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

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

Amit版本

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

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

zpqajqem1#

**第一步:**创建自定义Exception

php artisan make:exception CustomException

**步骤2:**在代码中包含该异常

use App\Exceptions\CustomException;
将您的错误传递给该Exception

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

**第三步: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()]);       
    }
}
xjreopfe

xjreopfe2#

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);
    }
}
yfwxisqw

yfwxisqw3#

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

php artisan make:exception CustomException

然后,您应该在自定义处理程序中调用这些方法“report()render()”,它们将覆盖App\Exceptions\Handler中现有的方法。
report()用于记录错误。
render()用于重定向返回错误或返回HTTP响应(如您自己的Blade文件)或构建API。
有关更多信息,您可以查看Laravel文档。

相关问题