基本的なルーティング

アプリケーションで使用するほとんどのルートは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はクロージャーでのルート定義だけではなく、コントローラークラスによる定義、さらにリソースコントローラーの生成も可能です。

詳細はコントローラーをご覧ください。