BackEnd

[Laravel] middlewareでHTTPリクエストの前後に処理を入れる

投稿日:2019年1月17日 更新日:

はじめに

引き続きLaravelの使い方を勉強しています。昔、別のフレームワークで「POSTされた文字列から改行コードのCRだけを削除する」、つまりwindowsから送信された場合は改行コードがCR+LFになるので、それをLFのみに変換するという機能を作ったことがありました。Laravelではどうやるのか調べて、middlewareという機能に行き当たりました。Laravelでは基本かつ頻繁に使われるもののようなので、少し掘り下げてみます。

環境はmacOS High Sierra+Laradockで構築し、LaravelのバージョンはLTS最新の5.5を使用します。

middlewareとは

どのwebアプリも「HTTPリクエストをコントローラに渡し、必要な処理を行ってレスポンスを返す」というのが基本のフローです。Laravelにおいてはこのフローの前後に挟まる処理をmiddlewareとして実装します。
以下はほんの一例で、他にも様々な要件がプロジェクトごとにあると思いますが、そうした要件の実装をコントローラに全て書いたりせず、コードを綺麗に分離することができそうです。

  • ログイン済みの状態でログインページにアクセスしたら、特定のページにリダイレクトする
  • フォームから送信された値をフィルタリングする
  • 特定のIP以外からのアクセスに対してはHTTP 404を返す
  • ステージング環境のみベーシック認証をかける
  • レスポンスのjsonに値を付け足す
  • レスポンスとして送るHTMLを最小化(minify)する
  • レスポンスを返した後にログを保存する/Redis等のストレージにセッション情報を保存する

実装

middleware作成

artisanコマンドを使用します。今回は前述の「POSTされた文字列から改行コードのCRだけを削除する」処理を実装しようと思います。
フォームから送信された値のフィルタリングを行うのでFormInputFilterという名前にします。

app/Http/Middleware以下にスケルトンが作成されます。

コード実装

handleメソッド内に記述します。return $next($request);より前のコードはコントローラに処理が渡る前に実行されます。
POST値を書き換えたい場合はrequestオブジェクトのmergeあるいはreplaceメソッドを使用します。

コントローラでの処理の後に実行したいコードがある場合、レスポンスを返す前に実行したいのであればhandle()に記述します(今回の実装目的ではないのでコメントアウトしています)。
レスポンスを返した後に実行したいコードはterminate()に記述します。ロギング・セッション更新・メール送信といった、レスポンス返却とは関係がない処理をmiddlewareに追い出すことで、レスポンスの高速化や処理の分割ができそうです。

middleware定義

作成したmiddlewareを定義することでmiddlewareが呼び出されるようにします。様々な方法があり、要件ごとにやり方は異なりますが、いくつかのパターンをご紹介します。

常に呼び出す

全てのアクセスで呼び出したい場合は以下のように記述します。アクセス元IP確認やログイン認証などは毎回行いたい処理になると思いますので、ここで定義することになるのではないでしょうか。
app/Http/Kernel.php$middlewareプロパティに記載することで、全てのリクエストで呼び出すmiddlewareとして定義されます。

特定のURLにアクセスした時のみ呼び出す

ルートを定義する箇所でmiddlewareの定義を同時に行えます。特定のアクションメソッドでのみ呼び出したいといった場合はこの定義になると思います。
http://localhost/registerというURLにPOSTされた時のみ呼び出す」と仮定した場合、routes/web.phpで以下のように追記します。

コントローラ単位で呼び出す

どのアクションメソッドかは問わず、特定のコントローラに処理が渡る時のみ呼び出したい場合です。
middlewareはルート定義ファイル以外にも、コントローラで呼び出すことができます。

ルート定義の確認

artisanコマンドを実行すると、Middlewareという項目で確認できます。

今回定義したFormInputFilterが、/registerにアクセスする時のMiddlewareに表示されています。

さいごに

リクエストの前後に処理を挟みたいというのはサーバサイドの実装では頻繁にあり、middlewareを使う方法はコードが切り離されて整理・把握しやすくなる印象を受けました。深く考えずに必要な処理をどんどんアクションメソッドに書き足してファットコントローラになることを防ぐためにも、こういったフレームワークの作法をしっかり学んでおきたいところです。
ただし、考えなしにmiddlewareを追加していってもそれはそれで全体の処理が重くなってしまいますので、キューによる非同期処理も考慮するなどして、全体的なレスポンス速度にも気を配りましょう。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応  PHPフレームワーク Laravel入門

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

Go言語

Go言語で使えるmigrationライブラリ

1 はじめに2 migrationライブラリ2.1 goose2.2 sql-migrate2.3 migu2.4 pop2.5 sqldef3 sqldefを使ってみる3.1 導入3.2 テーブルを ...

rails

Capistrano3でRailsアプリケーションをデプロイする

1 はじめに1.1 前提条件2 Cpistranoについて3 導入3.1 Gemのインストール3.2 設定ファイルの準備4 デプロイ設定4.1 Capfileを修正する4.2 各環境で共通のデプロイ設 ...

php logo

PHP入門 〜文字列と数値の操作〜

1 はじめに2 基本ルール2.1 開始と終了のタグ2.2 ホワイトスペース2.3 大文字と小文字の区別2.4 コメント2.5 変数の定義3 文字列の操作3.1 文字列の定義3.2 無駄なスペースを削除 ...

rails

RailsでSidekiqを使ってみた

1 はじめに1.1 実行環境2 前準備2.1 Redisのインストール3 Railsの準備3.1 プロジェクト作成3.2 新規登録時にAPIを叩く4 Sidekiqの準備4.1 Workerを作る5 ...

laravel logo

LaravelでHTTP通信

1 はじめに2 インストール3 基本的な使い方3.1 GETでリクエストを投げる3.2 リクエストヘッダーを指定3.3 クエリパラメータを指定3.4 timeout時間を指定3.5 POSTでリクエス ...

フォロー

follow us in feedly

page_side_300rect

2019年1月
« 12月 2月 »
 12345
6789101112
13141516171819
20212223242526
2728293031 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。