回到最上方

文件

路由

基礎路由

你的 Laravel 應用程式的路由將會被定義在 app/routes.php 的檔案中,最簡單的 Laravel 路由為一個 URI 及一個封閉呼叫的函式 (Closure callback)

基本 GET 路由

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

基本 POST 路由

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

註冊一個處理任何 HTTP 請求的路由 (GET、POST、PUT及DELETE)

Route::any('foo', function()
{
    return 'Hello World';
});

強制路由要經過 HTTPS的加密連線

Route::get('foo', array('https', function()
{
    return 'Must be over HTTPS';
}));

通常你可以使用 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]+');

路由過濾器

路由過濾器 (Route filters) 提供一個方便限制路由存取的方法,在限制某些路由需要通過驗證時,是一個很好用的辦法,在 Laravel 中有包含幾個過濾器,有 authauth.basicguestcsrf 4 個過濾器,這些過濾器是實作在 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' => '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, $value)
{
    //
});

以模式為基礎的過濾器

你也可以指定過濾器給整個集合的 URI 路由

Route::filter('admin', function()
{
    //
});

Route::when('admin/*', 'admin');

在以上的範例,admin 過濾器將會在路由開頭名稱為 admin/ 時去執行, * 是使用萬用字元,將會比對到所有的字元組合。

你也可以限制模式過濾器在指定的 HTTP 請求中執行:

Route::when('admin/*', 'admin', array('post'));

過濾類別

對於進階的過濾方法,你或許想要一個類別去取代過濾的方法,而不是使用封閉函式的方式,由於過濾器的類別在 IoC容器 中被解決了,你可以在這些過濾器使用相依注入的方式,獲得更大的可測性。

定義一個過濾類別

class FooFilter {

    public function filter()
    {
        // Filter logic...
    }

}

註冊一個類別為基礎的過濾器

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

命名路由

路由命名讓我們在產生"重新導向"或"網址"時,能夠更容易地去指向這個路由,你可以像這樣指定一個路由名稱:

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

你也可以指定一個路由名稱到控制器的任一個方法動作:

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

現在你可以在產生"重新導向"或"網址"時,使用路由的名稱了:

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

子網域路由

Laravel的路由也可以去處理萬用字元的子網域,傳送一個萬用字元的參數到這個網域下:

Registering Sub-Domain Routes

Route::group(array('domain' => '{account}.myapp.com'), function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});

路由前綴

一個群組的路由可以使用 prefix 選項當作這個路由的前綴詞:

Prefixing Grouped Routes

Route::group(array('prefix' => 'admin'), function()
{

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

});

路由模型綁定

模型 (Model) 可以方便的綁定在你的路由上,舉例來說,除了綁定使用者的編號到路由上,你也可以將整個使用者模型綁訂到路由上,去取得符合使用者編號資料的模型路由,首先使用 Route::model 的方法去指定用於整個模型的參數:

綁定參數到模型 (Model) 上

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

下一個,定義一個包含 {user} 參數的路由:

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

既然我們已經將 {user} 參數綁定到 User 模型上,這個 User 模型的實例將會被實做到這個路由上,因此舉例來說,如果有一個 profile/1 的請求到這個路由,則會將會轉為在 User 模型中編號為1的使用者。

備註: 如果比對到了模型的實例,但是在資料庫沒有找到這筆資料,則將會丟出 404 錯誤的訊息給使用者

如果你想要指定"未找到""的行為,你可以在第三個參數傳遞一個封閉的函式參數到這個 模型 (Model) 方法中:

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

有時你可能會想要使用你自己的路由參數取解析路由,只要簡單的使用 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 不只允許你使用封閉的函式,也可以使用控制器類別,更允許你建立一個 Resource 控制器(Controllers)

更多詳細的說明文件可以在 控制器(Controllers) 中找到。

討論