コードに入る前に、私の目的を説明しましょう。私のウェブアプリは販売用の車両を表示します。ユーザーが存在しないページにアクセスしようとすると、データベースに追加された最新の車両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);
}
Laravelの新しいバージョンでは、次のコマンドを使用してカスタムハンドラーを作成できます。
php artisan make:exception CustomException
次に、これらのメソッドを「report()、render()」と呼ぶ必要があります。 "カスタムハンドラー内で、App\Exceptions\Handler
の既存のハンドラーを上書きします。
エラーをログに記録する場合に使用されるreport()。
render()は、エラーでリダイレクトしたり、HTTP応答(独自のBladeファイルなど)を返したりする場合、またはAPIを構築する場合に使用されます。
詳細については、 Laravelドキュメント を確認してください。