Laravelのヘルパーの関数は本当に便利なもので、日常よく使うものです。しかし、こんな使い方もあったのか、と知らない使い方を知って嬉しくなることあります。今回は私を嬉しくさせる、route()のヘルパーの紹介です。

私はrouteに名前を付けるのが好きで、プログラムのrouteにはすべて名前がついています。それゆえに、route()のヘルパーは欠かせないものです。

以下は、Laravel 7.xバージョンの新規プロジェクトを作成してユーザー認証もインストールしたプロジェクトのrouteです。

+----------+------------------------+------------------+------------------------------------------------------------------------+
| Method   | URI                    | Name             | Action                                                                 |
+----------+------------------------+------------------+------------------------------------------------------------------------+
| GET|HEAD | /                      |                  | Closure                                                                |
| GET|HEAD | api/user               |                  | Closure                                                                |
| GET|HEAD | home                   | home             | App\Http\Controllers\HomeController@index                              |
| GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                |
| POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        |
| POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       |
| GET|HEAD | password/confirm       | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    |
| POST     | password/confirm       |                  | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            |
| POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  |
| GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm |
| POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                |
| GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        |
| GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      |
| POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  |
+----------+------------------------+------------------+------------------------------------------------------------------------+

第3番目のNameの列がrouteの名前です。この値をもとにtinkerで、route()を使っていろいろなurlを作成してみます。
まずは基本からで、route()の最初の引数に、route名を渡します。

>>> route('home');
=> "http://localhost/home"

作成されたurlの、http://localhostの部分は、.envAPP_URLの定義から来ています。
.envにおいて、

...
APP_URL=http://www.example.com
...

と定義すると、

>>> route('home');
=> "http://www.example.com/home"

となります。

今度は、route()に2番目の引数を与えます。

>>> route('password.reset', ['token' => '1232457890']);
=> "http://www.example.com/password/reset/1232457890"

このtokenは上のrouteの表のURIで password/reset/{token}と定義されているので、与えた値に置き換わります。

しかし、定義されていない変数も渡すこと可能です。

>>> route('password.reset', ['token' => '1232457890', 'type' => 'user']);
=> "http://www.example.com/password/reset/1232457890?type=user"

この値は、コントローラの引数の$requestを使って、$request->typeとかで取得できますね。

さらに、‘type’ => ‘user’の配列の形でなくても、単に、‘user’とかでも与えることできます。

>>> route('password.reset', ['token' => '1232457890', 'user']);
=> "http://www.example.com/password/reset/1232457890?user"

この場合は、コントローラ側では、$request->has('user')とかでブーリアン値で取得できます。

今度は、route()の第3の引数です。これはブーリアン値で、デフォルトがtrueでfalseを与えるとドメイン名がついた絶対URLではなくパス名だけを生成してくれます。

>>> route('home', null, false);
=> "/home"

最後に、redirect()にもroute()を使えます。

]
...
return redirect(route('home'));

でもOKですが、

...
return redirect()->route('home');

とチェーンできます。

By khino