全てのページで同じような処理を行う場合、各コントロールの__construct
に実装するより、Middleware
として実装した方が便利です。
Middlewareを使えば、値を追加したり、コントローラの処理をする前にリダイレクトさせる事が可能です。
今回は、リダイレクトではなく、viewだけ表示する方法を記載します。
実装方法
例えば、下記のような動的なルートの会員サイトがあったとします。
shops/{shop_url}/login
shops/{shop_url}/home
ルートのshop_url
はShop
というモデルに紐づいており、ユニークな情報です。
モデルには下記のようなパラメータがあります。
パラメータ名 | 概要 |
---|---|
shop_url | ショップの管理画面のURLに含める固有文字列 |
service_status | ショップが運営中かどうかの判定値(0が無効) |
404とそれ以外の例外の方法と対比しやすくするために次の条件で出し分けを行います。
shop_url
が存在しない場合は404を表示service_status
が無効な場合はロック用のviewを表示
Middlewareの記述
適当なミドルウェアを作成します。
ロックページ用のviewはuser.lock
という名前で用意しています。
<?php use App\Shop; public function handle($request, Closure $next) { // ショップのURLがルートに含まれていない場合 は404ページを表示 if(! $shopUrl = $request->route('shop_id')) { return abort(404); } // ショップのURLに該当するものがない場合は404ページを表示 if(! $shop = Shop::where(shop_id)->first()){ return abort(404); } // サービスが停止していたらロックページを表示 if($shop->service_usage_status == 0) { return response(view('user.lock')); } return $next($request); }
viewを直接返したい場合は、response
としてviewを返します。
return response(view('user.lock'));
「setCookie() on null」でエラーになりうる原因
Controllerで書くときのようにreturn view('ビュー名')
と実装すると、下記のようなエラーを吐きます。
Call to a member function setCookie() on null
protected function addCookieToResponse($request, $response) { $config = config('session'); $response->headers->setCookie( <--ここでエラーになる new Cookie( 'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']), $config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null ) ); return $response; }
これはresponse
の指定がない事が原因の可能性があります。