web-dev-qa-db-ja.com

Laravel 5.3でカスタム例外クラスとカスタムハンドラークラスを作成する

コードに入る前に、私の目的を説明しましょう。私のウェブアプリは販売用の車両を表示します。ユーザーが存在しないページにアクセスしようとすると、データベースに追加された最新の車両12台を表示するカスタム404ページが必要です。

私は以下を持っています...

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ビューを表示しません。これを機能させるには何をする必要がありますか?

[〜#〜] update [〜#〜]:クラスをモデルにバインドしている人へのメモです。以下を使用してクラス内の関数にアクセスしようとすると、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);
}
4
VenomRush

Laravelの新しいバージョンでは、次のコマンドを使用してカスタムハンドラーを作成できます。

php artisan make:exception CustomException

次に、これらのメソッドを「report()render()」と呼ぶ必要があります。 "カスタムハンドラー内で、App\Exceptions\Handlerの既存のハンドラーを上書きします。

エラーをログに記録する場合に使用されるreport()。

render()は、エラーでリダイレクトしたり、HTTP応答(独自のBladeファイルなど)を返したりする場合、またはAPIを構築する場合に使用されます。

詳細については、 Laravelドキュメント を確認してください。

0
Ali Ali