laravel5.6

Laravel5.6: エラーページを作る

現在、オーナー以外の人が記事を編集しようとすると下記のようなエラーページが表示されます。
001.png
(設定ファイルでAPP_DEBUG=falseにした状態)

カスタムHTTPエラーページを利用して、下記のような独自のエラーページを表示するようにします。
002.png

親記事

Laravel5.6で基本的なCRUDを作る

ビューを作る

下記の内容でファイルを作ります。
テストで利用するために.error-codeというCSSクラスを付けています。
:page_facing_up: resources/views/errors/403.blade.php
:page_facing_up: resources/views/errors/404.blade.php
:page_facing_up: resources/views/errors/500.blade.php

エラーページ用の翻訳も追加します。
:page_facing_up: resources/lang/ja.json

基本的にはこれだけでOKです。

ミドルウェアを移す

現状の問題点

404エラーの場合に、セッションやログイン関連のミドルウェアが実行されません。
また、以前の記事で作った言語判断用のミドルウェアも実行されません。

具体的には、たとえ上のミドルウェアを使って日本語を表示言語としてセッションに保存していても、404のページでは必ずフォールバック用の言語である英語で表示されます。
また、たとえログインしていてもビューでは未ログインとして表示されます。
403のページでは問題ないのですが…。

解決策

上記のミドルウェアをwebグループからグローバルへと移します。
これで、web用のルートに限らず全てのHTTPリクエストで実行されるようになります。
:link: グローバルミドルウェア

app/Http/Kernel.php
     protected $middleware = [
         \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
         \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
         \App\Http\Middleware\TrimStrings::class,
         \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

+        // $middlewareGroups から移動
+        // See 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, // 独自ミドルウェア
     ];

ひとりでずっと悩んでいましたが、全ての答えは下記のページに載っていました。
もっと英語に抵抗感がなくなるように、気軽に英語のページを検索できるように勉強しなければいけませんね…。

:link: 404.blade.php page user logged in issue
:link: Getting Auth::user() on custom 404 page.