現在、オーナー以外の人が記事を編集しようとすると下記のようなエラーページが表示されます。
カスタムHTTPエラーページを利用して、下記のような独自のエラーページを表示するようにします。
親記事
ビューを作る
下記の内容でファイルを作ります。
Laravel Duskによるテストで利用するために.error-code
というCSSクラスを付けています。
resources/views/errors/403.blade.php
resources/views/errors/404.blade.php
resources/views/errors/500.blade.php
エラーページ用の翻訳も追加します。
resources/lang/ja.json
基本的にはこれだけでOKです。
ミドルウェアを移す
現状の問題点
404エラーの場合に、以前の記事で作った言語判断用のミドルウェアも実行されません。
具体的には、たとえ上のミドルウェアを使って日本語を表示言語としてセッションに保存していても、404のページでは必ずフォールバック用の言語である英語で表示されます。
403のページでは問題ないのですが…。
解決策
上記のミドルウェアをwebグループからグローバルへと移します。
これで、web用のルートに限らず全てのHTTPリクエストで実行されるようになります。
readouble.com: グローバルミドルウェア
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
+
+ // $middlewareGroups['web'] から移動
+ // 参照: https://laracasts.com/discuss/channels/laravel/getting-authuser-on-custom-404-page/replies/293136
+ \App\Http\Middleware\EncryptCookies::class,
+ \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+ \Illuminate\Session\Middleware\StartSession::class,
+ \App\Http\Middleware\CheckLocale::class, // 独自ミドルウェア
];
protected $middlewareGroups = [
'web' => [
- \App\Http\Middleware\EncryptCookies::class,
- \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
- \Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
- \App\Http\Middleware\CheckLocale::class,
],
ひとりでずっと悩んでいましたが、全ての答えは下記のページに載っていました。
もっと英語に抵抗感がなくなるように、気軽に英語のページを検索できるように勉強しなければいけませんね…。
Laracastsでの質問: Getting Auth::user() on custom 404 page.