ウェブログラム

実践しながらじっくり学ぶ、Webプログラム習得サイトです。自作サービスの公開までWeb開発を実践していきましょう!

Webrogram

自分のオリジナルサービスを作って運営しよう!

Laravelのミドルウェアとは?メリットと使い方も解説

Laravel入門記事一覧はこちら webrogram.hatenadiary.jp

今回はLaravelのミドルウェアについて紹介します。

ミドルウェアの利用場面は非常に多く、とても重要な仕組みなのでしっかりと抑えておきましょう。

結構簡単に利用できますよ。ミドルウェアの使い方だけ知りたい方は「ミドルウェアとは」と「ミドルウェアのメリット」は読み飛ばしちゃってください。

さて、実践していきましょう。

ミドルウェアとは

ミドルウェアというのは、コントローラのアクションが実行される前か後に、特定の処理が出来るものになります。

例えば、Userコントローラにindexアクションがあったとして、このindexアクションが実行される前に、何かの処理をしたり、 indexアクションが実行された後に、何かの処理をしたりします。

流れ的には

  1. ルーティングからUserコントローラのindexアクションが呼ばれる
  2. ミドルウェアの何らかの前処理が実行される
  3. indexアクションが実行される
  4. ミドルウェアの何らかの後処理が実行される

2、4どちらに任意の処理を挟むかは自由に選べます。

ミドルウェアのメリット

ミドルウェアがコントローラのアクションの前後で何か処理をすることが出来ると言いましたが、 では、これの何が嬉しいのか?

ログインしているかチェックに使える

例えば、ログインしている事をアクションの前処理で確認したい場合。

indexアクションを呼ばれ、TOPページが表示されるとして、 TOPページ遷移出来るのは、ログインをしている人のみとすると、 ミドルウェアでindexアクションの前処理として、ログインチェックのミドルウェアを作成し差し込みます。

これで、ログインしている人はTOPページに遷移でき、ログインしていない人はエラーページに飛ばすことなどが出来ます。

indexアクションでログインしているかチェックすれば?

確かに、ミドルウェアをいちいち挟まなくても、 そもそもindexアクションにログインしているかどうかのチェック処理を書けば良さそうです。

もちろん、これでも期待通りの結果になりますが、 indexアクション以外に、他のアクションがある場合、ミドルウェアはとても便利になります。

例えば、すべてのアクションの前にログインチェックミドルウェアを設定するだけで、 すべてのアクションで、複雑なログインチェックが出来たりします。

この他にも、このアクションとこのアクションには、このミドルウェアとこのミドルウェア、こっちのアクションは....といった具合に 柔軟にミドルウェアの差込が行えるので、非常に使いやすく、プログラムも見通しが良くなります。

ミドルウェアの設定は、ルーティングの箇所で設定します。

ミドルウェアの使い方

それでは、基本的なミドルウェアの使い方を見ていきましょう。

今回、アクションの前処理として、「helloだよ」と表示するミドルウェアを作成していきます。

コントローラとルーティング準備

IndexControllerを作成し、indexアクションと、showアクションを作成し、それぞれ文字を表示してます。

app/Http/Controllers/IndexController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class IndexController extends Controller
{
  // TOP画面
  public function index()
  {
    dump("TOP画面だよ");
  }

  // 詳細画面
  public function show()
  {
    dump("詳細画面だよ");
  }
}

ルーティングは以下の通りです。

routes/web.php

// TOP画面
Route::get('/', 'IndexController@index');
// 詳細画面
Route::get('/show', 'IndexController@show');

これで「/」にアクセスしたときは、「TOP画面だよ」と表示され、 「/show」にアクセスしたときは「詳細画面だよ」と表示されます。

ミドルウェアの作成

HelloMiddlewareを作成しましょう。 プロジェクト直下で以下のコマンドを実行してください。

php artisan make:middleware HelloMiddleware

app/Http/Middleware/HelloMiddleware.phpが作成されたと思います。 以下のように書き換えて下さい(コメントは省略しました)

namespace App\Http\Middleware;

use Closure;

class HelloMiddleware
{
    public function handle($request, Closure $next)
    {
        dump("helloだよ");
        return $next($request);
    }
}

これで、アクションの前に「helloだよ」と表示するミドルウェアが作成できました。

ミドルウェアの登録

ミドルウェアを作成することは出来ましたが、ルーティングの際に使えるようにするため、

app/Http/Kernel.phpというファイルにミドルウェアと登録します。

$routeMiddlewareの一番下に追加しました。

    // ミドルウェアに名前をつける
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'hello' => \App\Http\Middleware\HelloMiddleware::class, // 追加
    ];

これでhelloという名前で、HelloMiddlewareが使えるようになりました。

次に、ルーティングで使ってみましょう。

routes/web.php

// TOP画面
Route::get('/', 'IndexController@index')->middleware('hello');
// 詳細画面
Route::get('/show', 'IndexController@show')->middleware('hello');

これで、「/」と「/show」にアクセスしてみて下さい。

以下のように表示されれば成功です。

f:id:iku8:20180909151547p:plain

f:id:iku8:20180909151552p:plain

もっとミドルウェアについて詳しく知りたい方は以下を読んでください。

webrogram.hatenadiary.jp