基本的なルーティング
アプリケーションで使用するほとんどのルートはapp/routes.php
の中で定義されます。LaravelのもっともシンプルなルートはURIとクロージャーで構成されます。
基本のGETルート
Route::get('/', function()
{
return 'Hello World';
});
基本のPOSTルート
Route::post('foo/bar', function()
{
return 'Hello World';
});
複数のHTTP動詞に対応するルートの登録
Route::match(array('GET', 'POST'), '/', function()
{
return 'Hello World';
});
全てのHTTP動詞に対応するルートの登録
Route::any('foo', function()
{
return 'Hello World';
});
HTTPSによるルーティングを強要する
Route::get('foo', array('https', function()
{
return 'Must be over HTTPS';
}));
ルートに対するURLを生成する必要があることも多いでしょう。URL::to
を使用してください。
$url = URL::to('foo');
ルートパラメーター
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]+');
Whereに配列で指定する
もちろん、必要に応じ、配列でも束縛を指定できます。
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
グローバルパターンを定義する
ルートパラメータを常時束縛したい場合は、pattern
メソッドで正規表現を指定することができます。
Route::pattern('id', '[0-9]+');
Route::get('user/{id}', function($id)
{
// Only called if {id} is numeric.
});
ルートパラメーター値にアクセスする
ルートの外でルートパラメータにアクセスする必要があれば、Route::input
メソッドを使用して下さい。
Route::filter('foo', function()
{
if (Route::input('id') == 1)
{
//
}
});
ルートフィルター
ルートフィルターは指定されたルートへのアクセスを制限するための便利な方法で、例えば認証が必要なサイトの領域を作成するのに便利です。Laravelフレームワークには多くのフィルターが含まれており、その中にはauth
フィルター、guest
フィルター、csrf
フィルターが含まれます。app/filter.php
ファイルの中で定義されます。
注意: アプリケーションの環境が
testing
の時、フィルターは無効です。
ルートフィルターを定義する
Route::filter('old', function()
{
if (Input::get('age') < 200)
{
return Redirect::to('home');
}
});
フィルターからレスポンスを返す場合、そのレスポンスはリクエストに対するレスポンスと考えられ、そのルートが実行されることはありません。そのルートに指定されているafter
フィルターもキャンセルされます。
ルートにフィルターを指定する
Route::get('user', array('before' => 'old', function()
{
return 'You are over 200 years old!';
}));
コントローラーアクションにフィルターを指定する
Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));
ルートに複数のフィルターを指定する
Route::get('user', array('before' => 'auth|old', function()
{
return 'You are authenticated and over 200 years old!';
}));
配列により複数のフィルターを指定する
Route::get('user', array('before' => array('auth', 'old'), function()
{
return 'You are authenticated and over 200 years old!';
}));
フィルターパラメーターを指定する
Route::filter('age', function($route, $request, $value)
{
//
});
Route::get('user', array('before' => 'age:200', function()
{
return 'Hello World';
}));
Afterフィルターは$response
を3番目の引数として受け取ります。
Route::filter('log', function($route, $request, $response)
{
//
});
パターンを元にしたフィルター
URIを元にしたルート全体にフィルターを適用することも可能です。
Route::filter('admin', function()
{
//
});
Route::when('admin/*', 'admin');
上の例では、admin
フィルターがadmin/
で始まる全てのルートに適用されます。アスタリスクはワイルドカードとして取り扱われ、全ての文字と結び付けられます。
HTTP動詞によりパターンフィルターを制約することもできます。
Route::when('admin/*', 'admin', array('post'));
フィルタークラス
より上級のフィルタリングのため、クロージャーの代わりにクラスを使用することもできます。テストを行いやすくするため、これらのフィルターをアプリケーションのIoCコンテナで解決することで、依存性を注入することも可能です。
クラスベースのフィルターを登録する
Route::filter('foo', 'FooFilter');
デフォルトでは、FooFilter
クラスのfilter
メソッドが呼び出されます。
class FooFilter {
public function filter()
{
// フィルターのロジック...
}
}
fileter
メソッドを使用したくないのでしたら、他のメソッドを指定してください。
Route::filter('foo', 'FooFilter@foo');
名前付きルート
リダイレクトやURLを生成する場合により便利にするために、ルートにつけた名前で、ルートを参照することができます。このようにルートに名前を指定してください。
Route::get('user/profile', array('as' => 'profile', function()
{
//
}));
コントローラアクションに対してもルート名を指定できます。
Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));
これで、ルート名をURLやリダイレクトを生成する場合に使用できます。
$url = URL::route('profile');
$redirect = Redirect::route('profile');
実行中のルート名はcurrentRouteName
メソッドでアクセスできます。
$name = Route::currentRouteName();
ルートグループ
フィルターをルートのグループに対して使用する必要がある場合もあるでしょう。それぞれのルートにフィルターを個別に指定する代わりに、ルートグループを使用できます。
Route::group(array('before' => 'auth'), function()
{
Route::get('/', function()
{
// Authフィルター通過
});
Route::get('user/profile', function()
{
// Authフィルター通過
});
});
またgroup
の配列へ、namespace
引数により、そのグループのコントローラー全部に対し、名前空間を指定することもできます。
Route::group(array('namespace' => 'Admin'), function()
{
//
});
サブドメインルーティング
Laravelのルートではサブドメインもワイルドカードで処理でき、ドメイン名のワイルドカードパラメーターをルートに渡すことも可能です。
サブドメインルートの登録
Route::group(array('domain' => '{account}.myapp.com'), function()
{
Route::get('user/{id}', function($account, $id)
{
//
});
});
ルートのプリフィックス
ルートグループのプレフィックスはグループの属性配列でprefix
オプションを使用し指定します。
Route::group(array('prefix' => 'admin'), function()
{
Route::get('user', function()
{
//
});
});
ルートとモデルの結合
モデル結合はルートからモデルのインスタンスを受け取るための便利な手法です。例えば、ユーザーIDを受け取る代わりに、そのIDに合致するUserモデルのインスタンスを受け取ることができます。最初にRoute::model
メソッドで指定したパラメーターで使用するモデルを指定します。
モデルとパラメーターを結合する
Route::model('user', 'User');
次に、{user}
パラメーターを含んだルートを定義します。
Route::get('profile/{user}', function(User $user)
{
//
});
{user}
パラメーターをUser
モデルと結合済みですから、ルートからUser
インスタンスが渡されます。例えば、profile/1
がリクエストされると、IDが1のUser
インスタンスが渡されます。
注目:もしデータベースにモデルのインスタンスが見つからない場合、404エラーがスローされます。
もし独自の"not
found"動作を指定したい場合は、model
メソッドへクロージャーを3つ目の引数として渡してください。
Route::model('user', 'User', function()
{
throw new NotFoundHttpException;
});
場合によっては自分でルートパラメーターを解決したい場合もあるでしょう。シンプルにRoute::bind
メソッドを使用してください。
Route::bind('user', function($value, $route)
{
return User::where('name', $value)->first();
});
404エラーのスロー
手動で404エラーをルートから発生させるには2つのやり方があります。最初の方法はApp::abort
メソッドを使用するものです。
App::abort(404);
2つめの方法はSymfony\Component\HttpKernel\Exception\NotFoundHttpException
のインスタンスをスローするやりかたです。
404例外の取り扱いやこうしたエラーのカスタム処理を使用する詳しい方法はドキュメントのエラーの章をご覧ください。
コントローラーへのルーティング
Laravelはクロージャーでのルート定義だけではなく、コントローラークラスによる定義、さらにリソースコントローラーの生成も可能です。
詳細はコントローラーをご覧ください。