はじめに
LaravelはアプリケーションのURLを生成するためのヘルパーをいくつか提供しています。 これらはテンプレートやAPIレスポンスでリンクを構築する際、またはアプリケーションの別の場所へリダイレクトレスポンスを生成する際に特に便利です。基本的な使い方
URLの生成
url ヘルパーを使って任意のURLを生成できます。
生成されたURLは、アプリケーションが処理している現在のリクエストのスキーム(HTTPまたはHTTPS)とホストを自動的に使用します。
query メソッドを使います。
現在のURLの取得
url ヘルパーにパスを指定しない場合、Illuminate\Routing\UrlGenerator インスタンスが返され、現在のURLに関する情報にアクセスできます。
URL ファサードからもアクセスできます。
直前のURLの取得
ユーザーが訪問していた直前のURLを知りたい場合があります。url ヘルパーの previous メソッドや previousPath メソッドで取得できます。
名前付きルートのURL
route ヘルパーは名前付きルートへのURLを生成するために使えます。
名前付きルートを使うと、ルートに定義された実際のURLに依存せずにURLを生成できます。
そのため、ルートのURLが変更されても、route 関数の呼び出しを変更する必要がありません。
Eloquentモデル
Eloquentモデルのルートキー(通常は主キー)を使ってURLを生成することが多いでしょう。 そのためにEloquentモデルをパラメータ値として渡せます。route ヘルパーはモデルのルートキーを自動的に取り出します。
署名付きURL
Laravelでは名前付きルートへの「署名付き」URLを簡単に作成できます。 これらのURLにはクエリ文字列に「署名」ハッシュが付加され、URLが作成後に改ざんされていないことをLaravelが検証できます。 署名付きURLは、公開アクセス可能だがURL操作に対する保護が必要なルートに特に便利です。 たとえば、顧客にメールで送信する公開「登録解除」リンクを実装するために署名付きURLを使えます。URL ファサードの signedRoute メソッドを使って署名付きURLを作成します。
signedRoute メソッドに absolute 引数を指定することで、署名URLハッシュからドメインを除外できます。
temporarySignedRoute メソッドを使います。
Laravelは一時的な署名付きURLを検証する際、署名付きURLにエンコードされた有効期限タイムスタンプが経過していないことを確認します。
署名付きURLの検証フロー
署名付きルートリクエストの検証
受信リクエストに有効な署名があることを確認するには、Illuminate\Http\Request インスタンスの hasValidSignature メソッドを呼び出します。
hasValidSignatureWhileIgnoring メソッドを使います。
signed(Illuminate\Routing\Middleware\ValidateSignature)ミドルウェアをルートに割り当てることもできます。
受信リクエストに有効な署名がない場合、ミドルウェアは自動的に 403 HTTPレスポンスを返します。
relative 引数をミドルウェアに指定します。
無効な署名付きルートへの応答
有効期限切れの署名付きURLにアクセスすると、403 HTTPステータスコードの汎用エラーページが表示されます。
アプリケーションの bootstrap/app.php ファイルで InvalidSignatureException 例外のカスタム「render」クロージャを定義することで、この動作をカスタマイズできます。
コントローラーアクションのURL
action 関数は指定されたコントローラーアクションのURLを生成します。
フルエントURIオブジェクト
LaravelのURIクラスは、オブジェクトを通じてURIを作成・操作するための便利なフルエントインターフェースを提供します。デフォルトのURLパラメータ
特定のURLパラメータにリクエスト全体のデフォルト値を指定したい場合があります。 たとえば、多くのルートに{locale} パラメータが定義されているとします。
route ヘルパーを呼び出すたびに locale を渡すのは面倒です。
そこで URL::defaults メソッドを使って、現在のリクエスト中に常に適用されるこのパラメータのデフォルト値を定義できます。
このメソッドはルートミドルウェアから呼び出すと、現在のリクエストにアクセスできます。
locale パラメータのデフォルト値が設定されると、route ヘルパーでURLを生成する際にその値を渡す必要がなくなります。
URLデフォルト値の設定はLaravelの暗黙的なモデルバインディングの処理を妨げる場合があります。
URLデフォルト値を設定するミドルウェアをLaravel自身の
SubstituteBindings ミドルウェアより前に実行されるようミドルウェアの優先度設定を行ってください。
アプリケーションの bootstrap/app.php ファイルで priority ミドルウェアメソッドを使って設定できます。