全てのページで同じような処理を行う場合、各コントロールの__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の指定がない事が原因の可能性があります。