【Larael】Middlewareで直接Viewを表示する

全てのページで同じような処理を行う場合、各コントロールの__constructに実装するより、Middlewareとして実装した方が便利です。

Middlewareを使えば、値を追加したり、コントローラの処理をする前にリダイレクトさせる事が可能です。
今回は、リダイレクトではなく、viewだけ表示する方法を記載します。

実装方法

例えば、下記のような動的なルートの会員サイトがあったとします。

shops/{shop_url}/login
shops/{shop_url}/home

ルートのshop_urlShopというモデルに紐づいており、ユニークな情報です。 モデルには下記のようなパラメータがあります。

パラメータ名 概要
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の指定がない事が原因の可能性があります。

©︎2017-2018 WebSandBag