路由

基本路由

應用程式大多數的路由都會被定義在 app/routes.php 中。最簡單的一個路由是由一個 URI 和閉包回調(Closure callback)。

基本 GET 路由

Route::get('/', function()
{
    return 'Hello World';
});

基本 POST 路由

Route::post('foo/bar', function()
{
    return 'Hello World';
});

在一個路由中註冊多個動作

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';
}));

通常情況下,你需要產生 URLs 到你的路由上,你可以使用 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 框架中包含了數個篩選器,像是 authauth.basicguestcsrf 篩選器。他們都放在 app/filters.php 中。

定義一個路由篩選器

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';
}));

在篩選器接收到一個 $response 會被當成第三個參數傳遞進篩選器:

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()
    {
        // Filter logic...
    }

}

如果你不希望使用 filter 方法,只要指定其他方法即可:

Route::filter('foo', 'FooFilter@foo');

指名路由

指名路由在產生重導與 URLs 至路由時更為方便。你可以指定一個名稱給指定的路由:

Route::get('user/profile', array('as' => 'profile', function()
{
    //
}));

你一樣可以為控制器動作指定一個路由名稱:

Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));

現在你可以在產生 URLs 或重導時使用該路由名稱:

$url = URL::route('profile');

$redirect = Redirect::route('profile');

你一樣可以透過 currentRouteName 方法來取得正在執行中的路由名稱:

$name = Route::currentRouteName();

路由群組

有時候你需要套用篩選器到一個群組的路由上。不需要為每個路由去套用篩選器,你只需使用路由群組:

Route::group(array('before' => 'auth'), function()
{
    Route::get('/', function()
    {
        // Has Auth Filter
    });

    Route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});

你一樣可以在 group 陣列中使用 namespace 參數,指定在這 group 中的控制器都有一個共同的命名空間:

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 的整個使用者模型實體。首先,使用 Route::model 方法可以指定作為參數的模型:

綁定參數至模型

Route::model('user', 'User');

接著,定義一個路由並包括一個 {user} 參數:

Route::get('profile/{user}', function(User $user)
{
    //
});

既然我們綁定了 {user} 參數到 User 模型,則 User 實體就會被注入到路由內。因此,假定有一個請求送至 profile/1 則會注入一個 ID 為 1 的 User 實體。

注意: 假如在資料庫內沒有任何一個模型實體符合,則會拋出 404 錯誤。

假如您希望指定您自定的「找不到」錯誤行為,你可以在 model 方法裡的第三個參數指定一個 Closure:

Route::model('user', 'User', function()
{
    throw new NotFoundHttpException;
});

在某些情況下,您可能會希望可以使用您自定的路由綁定方式。這時您可以使用 Route::bind 方法來達成:

Route::bind('user', function($value, $route)
{
    return User::where('name', $value)->first();
});

404 錯誤

有兩種方式可以在路由內手動觸發 404 錯誤。第一種是呼叫 App::abort 方法:

App::abort(404);

第二種,你可以拋出一個 Symfony\Component\HttpKernel\Exception\NotFoundHttpException 實體。

有關如何處理 404 例外狀況和自定回應的詳細資訊,可以參考 錯誤 章節內的說明。

控制器路由

Laravel 允許您不止可以路由至 Closures,也可以路由至控制器類別,甚至可以路由至 資源控制器

更多詳細資訊可參考 控制器 一節內的說明。