3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelのミドルウェア【個人的なお勉強アウトプット】

Last updated at Posted at 2022-03-23

参考図書

WEBの基本は、アクセスしてリクエストを受け取り、結果をレスポンスを返す。
その基本となる部分を補完する様々な機能がLaravelには用意されている。

ミドルウェアとは

コントローラとは別に、「指定のアドレスにリクエストが送られてきたら、自動的に何らかの処理を行う」という仕組み。
リクエストに対して共通する処理はコントローラに置くと重複するし、重くなる。そのような処理はミドルウェアで処理させる。
ミドルウェアはリクエストがコントローラのアクションに届く前(または後)に配置されるレイヤー層のプログラム。
ミドルウェアの設定はルート情報を記述する際に指定する。
コントローラとは完全に分離されているため、コントローラの処理には左右されない。

リクエスト、レスポンスの流れにミドルウェアがどう絡むか

①リクエストが送られる
②ミドルウェアのhandleが呼び出される。
③ミドルウェアで$nextを実行する。複数ミドルウェアがある場合は次のミドルウェアのhandleが呼び出される
④他にミドルウェアがない場合はコントローラのアクションが呼び出される。
⑤アクションメソッドが終わるとレンダリングされ、レスポンスが生成される。生成されたレスポンスが$nextの戻り値としてミドルウェアに返される。
⑥ミドルウェアで返送されたレスポンスがreturnとして返され、これがクライアントへ返送される。

上記の流れがあるのでミドルウェアはコントローラーのアクションの前と後で処理をはさみこめる。

ミドルウェアの作成

php artisan make:middleware HelloMiddleware
app/Http/Middlewareにミドルウェアファイルが作成される
上述のHelloMiddlewareがファイル名。

ミドルウェアファイル

app/Http/Middleware/helloMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class HelloMiddleware
{

    public function handle(Request $request, Closure $next)
    {
       return $next($request);
    }
}

第一引数の$requestは、リクエストの情報を管理するRequestインスタンスが渡される。
$nextはCloosureクラスのインスタンス。無名クラスを表すためのクラス。$nextを呼び出し実行することで、ミドルウェアからアプリケーションを送るリクエスト(Requestインスタンス)を作成している。

前処理

app/Http/Middleware/hogeMiddleware.php
public function handle($request, Closure $next){
//処理を実行する
return $next($request)
}

$nextは上述の通り、無名関数のインスタンスが入った変数。
returnすることで、処理結果をコントローラに渡す。

後処理

app/Http/Middleware/hogeMiddleware.php
public function handle($request, Closure $next){
$response = $next($request)
//処理を実行する
return $response;
}

$response = $next($request)でコントローラーでの処理結果(処理してなくても)を受け取っている。

前処理の実例

app/Http/Middleware/helloMiddleware.php
class HelloMiddleware{
public function handle($request, Closure $next){
$data = [
['name'=>'taro', 'mail'=>'taro@web'],
['name'=>'hanako', 'mail'=>'hanako@web'],
['name'=>'sachiko', 'mail'=> 'sachiko@web'],
];
$request->merge(['data'=>$data]);
return $next($request);
}
}

mergeはフォームの送信で送られるinputの値に新たな値を追加するもの。
これによりdataという項目で$dataの内容が追加される。
コントローラ側では$request->dataでこの値を取り出せる。

ミドルウェアの実行

ルーティングでミドルウェアを呼び出す処理を記述する。

routes/web.php
use App\Http\Middleware\HelloMiddleware;

Route::get('hello', 'App\Http\Controllers\HelloController@index')->middleware(HelloMiddleware::class);

Route::getの後にメソッドチェーンをつかってmiddlewareメドッドを追加する。
複数のミドルウェアを利用したい場合はRoute::get(...)->middleware(...)->middleware(...)
と記述。

コントローラーでリクエストした値をビューに渡す

app/Http/Controllers/HelloController.php
public function index(Request $request){
return view('hello.index', ['data'=>$request->data])
}

$requestをdataに置き換える。連想配列のdataというキー名にすることでビューに渡している。
ビューではdataという変数名で値を表示できる。

後処理の実例

app/Http/Middleware/helloMiddleware.php
    public function handle(Request $request, Closure $next)
    {
       //最初に$nextを実行し、結果を$responseに代入
       //コントローラのアクションが実行され、結果のレスポンスが$responseに代入される。
       $response = $next($request);

       //$responseのcontentメソッドで、レスポンスに設定されているHTMLのソースコードのテキストを取り出せる。
       $content = $response->content();

       $content = '代入テキスト';

              //レスポンスへのコンテンツの設定
       $response->setContent($content);
       return $response;
    }
}
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?