路由
基礎路由
你的 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 中有包含幾個過濾器,有 auth
、 auth.basic
、 guest
跟 csrf
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) 中找到。