基本的なルーティング
アプリケーションのほとんどのルートは、app/Http/routes.php
ファイルの中で定義されるでしょう。このファイルは、App\Providers\RouteServiceProvider
クラスによりロードされています。一番基本的な、LaravelのルートはURIと「クロージャー」を指定します。
基本のGETルート
Route::get('/', function()
{
return 'Hello World';
});
その他の基本ルート
Route::post('foo/bar', function()
{
return 'Hello World';
});
Route::put('foo/bar', function()
{
//
});
Route::delete('foo/bar', function()
{
//
});
複数のHTTP動詞に対応するルートの登録
Route::match(['get', 'post'], '/', function()
{
return 'Hello World';
});
全てのHTTP動詞に対応するルートの登録
Route::any('foo', function()
{
return 'Hello World';
});
ルートに対するURLを生成する必要が時々起こると思います。url
ヘルパを使用できます。
$url = url('foo');
CSRFからの保護
Laravelでは、クロス・サイト・リクエスト・フォージェリからアプリケーションを簡単に守られます。クロス・サイト・リクエスト・フォージェリは悪意のあるエクスプロイトの一種であり、信頼するユーザーの代わりに、認められていないコマンドを実行します。
Laravelは、アプリケーションにより管理されているアクティブなユーザーの各セッションごとに、CSRF「トークン」を自動的に生成しています。このトークンは認証済みのユーザーが、実装にアプリケーションに対してリクエストを送信しているのかを確認するために役立ちます。
CSRFトークンのフォームへの挿入
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
もちろん、Blade テンプレートエンジンを使用できます。
<input type="hidden" name="_token" value="{{ csrf_token() }}">
POST、PUT、DELETEリクエストのCSRFトークンを自分で確認する必要はありません。VerifyCsrfToken
HTTPミドルウェアが、リクエスト中のトークンが、セッションに保存されているトークンと一致するか、確認しています。
さらに、"POST"パラメーターとしてCSRFトークンを見つけるため、このミドルウェアはJavascriptのフレームワークで一般的に使用されている、X-XSRF-TOKEN
リクエストヘッダーもチェックします。
擬似メソッド
HTMLフォームはPUT
とDELETE
アクションをサポートしていません。ですから、PUT
とDELETE
のルートを呼び出すHTMLフォームを定義している場合、_method隠しフィールドをそのフォームに追加する必要があります。
_method
フィールドで送る値は、HTTPリクエストのメソッドとして使用されます。例をご覧ください。
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>
ルートパラメーター
もちろんルート中にある、リクエストURIのセグメントを取得することもできます。
基本的なルートパラメーター
Route::get('user/{id}', function($id)
{
return 'User '.$id;
});
オプションのルートパラメーター
Route::get('user/{name?}', function($name = null)
{
return $name;
});
デフォルト値を指定したオプションのルートパラメーター
Route::get('user/{name?}', function($name = 'John')
{
return $name;
});
正規表現によるルートの束縛
Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');
正規表現の配列による束縛
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+'])
グローバルパターンの定義
pattern
メソッドを使用すれば、ルートパラメーターを指定した正規表現で常に束縛することができます。これらは、RouteServiceProvider
のbefore
メソッドで定義することを推奨します。
$router->pattern('id', '[0-9]+');
パターンが定義されると、そのパラメーターを使用する全ルートに適用されます。
Route::get('user/{id}', function($id)
{
// Only called if {id} is numeric.
});
ルートパラメーター値へのアクセス
ルートの外で、ルートパラメーターの値にアクセスする必要がある場合、input
メソッドが使用できます。
if ($route->input('id') == 1)
{
//
}
また、現在のルートパラメーターへは、Illuminate\Http\Request
インスタンスによってもアクセスできます。現在のリクエストのリクエストインスタンスは、Request
ファサードや、依存が注入される場所でIlluminate\Http\Request
をタイプヒントで指定することによってもアクセス可能です。
use Illuminate\Http\Request;
Route::get('user/{id}', function(Request $request, $id)
{
if ($request->route('id'))
{
//
}
});
名前付きルート
リダイレクトやURLを生成する場合により便利にするために、ルートにつけた名前で、ルートを参照することができます。ルート名を配列キーのas
で定義してください。
Route::get('user/profile', ['as' => 'profile', function()
{
//
}]);
コントローラアクションに対してもルート名を指定できます。
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
これで、ルート名をURLやリダイレクトを生成する場合に使用できます。
$url = route('profile');
$redirect = redirect()->route('profile');
実行中のルート名はcurrentRouteName
メソッドでアクセスできます。
$name = Route::currentRouteName();
ルートグループ
フィルターをルートのグループに対して使用する必要がある場合もあるでしょう。それぞれのルートにフィルターを個別に指定する代わりに、ルートグループを使用できます。
Route::group(['before' => 'auth'], function()
{
Route::get('/', function()
{
// Authフィルター適用
});
Route::get('user/profile', function()
{
// Authフィルター適用
});
});
またgroup
の配列へ、namespace
引数により、そのグループのコントローラー全部に対し、名前空間を指定することもできます。
Route::group(['namespace' => 'Admin'], function()
{
//
});
注目: デフォルトで
RouteServiceProvider
は、名前空間グループの中でroutes.php
ファイルを呼び出します。これにより、完全な名前空間を指定せずに、コントローラールートが登録できます。
サブドメインルーティング
Laravelのルートではサブドメインをワイルドカードで処理でき、ドメイン名のワイルドカードパラメーターをルートに渡すことも可能です。
サブドメインルートの登録
Route::group(['domain' => '{account}.myapp.com'], function()
{
Route::get('user/{id}', function($account, $id)
{
//
});
});
ルートのプリフィックス
ルートグループのプレフィックスはグループの属性配列でprefix
オプションを使用し指定します。
Route::group(['prefix' => 'admin'], function()
{
Route::get('user', function()
{
//
});
});
ルートとモデルの結合
Laravelモデル結合は、モデルのインスタンスをルートから受け取る、便利な手法です。例えば、ユーザーのIDを受け取る代わりに、そのIDに合致するUserモデルのインスタンスを受け取ることができます。
最初に、ルーターのmodel
メソッドで指定したパラメーターで使用するモデルを指定します。モデルの結合は、RouteServiceProvider::boot
メソッドの中で定義してください。
モデルとパラメーターを結合する
public function boot(Router $router)
{
parent::boot($router);
$router->model('user', 'App\User');
}
次に、{user}
パラメーターを含んだルートを定義します。
Route::get('profile/{user}', function(App\User $user)
{
//
});
{user}
パラメーターとUser
モデルを結合済みですから、ルートからUser
インスタンスが渡されます。例えば、profile/1
がリクエストされると、IDが1のUser
インスタンスが渡されます。
注目:もしデータベースにモデルのインスタンスが見つからない場合、404エラーがスローされます
もし独自の"not
found"動作を指定したい場合は、model
メソッドへクロージャーを3つ目の引数として渡してください。
Route::model('user', 'User', function()
{
throw new NotFoundHttpException;
});
独自のインスタンス取得ロジックを使用したい場合は、Router::bind
メソッドを使用してください。bind
メソッドのクロージャーには、URIセグメントの値が渡されますので、ルートへ注入したいクラスのインスタンスを返してください。
Route::bind('user', function($value)
{
return User::where('name', $value)->first();
});
404エラーのスロー
手動で404エラーをルートから発生させるには2つのやり方があります。最初の方法はabort
ヘルパを使用するものです。
abort(404);
abort
ヘルパはただ、Symfony\Component\HttpFoundation\Exception\HttpException
例外を指定したステータスコードと共にスローするだけです。
2つめの方法はSymfony\Component\HttpKernel\Exception\NotFoundHttpException
のインスタンスをスローするやりかたです。
404例外の取り扱いやこうしたエラーのカスタム処理を使用する詳しい方法はドキュメントのエラーの章をご覧ください。