Laravel Routing
PHP:7.2
Laravel:5.7
Laravel 所有的 routes 定義都是寫在 routes
目錄裡,這裡介紹一下兩個最常用的:
- routes/web.php
- routes/api.php
根據檔名的命名,顧名思義分別是定義一般頁面與 API 的 routes,這兩支檔案又綁了 RouteServiceProvider
這個 Provider,因此定義在 routes/api.php
的 routes 都會自動加上 /api
的 prefix。
舉例來說,以下這個範例如果寫在 web.php
及 api.php
,進入的 URL 分別是 /foo
、 /api/foo
。
Route::get('hello', function () {
return 'Hello World';
});
基本使用
Laravel route 的撰寫很容易,基本上是以 Http verb 為 method name 來決定。
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
基本範例
// 該頁只顯示字串
Route::get('hello', function () {
return 'Hello World';
});
// 直接使用 resources/views 裡的頁面
Route::get('/', function () {
return view('welcome');
});
// 綁定 Controller (格式為 Controller Namespace@method )
// RouteServiceProvider 會預設定義 Namespace 在 App\Http\Controllers
Route::get('/user', 'UserController@index');
Route::post('/user/update', 'API\UserController@update');
RESTful
現在的網站或 API 設計已經都是走 RESTful 的架構了, Laravel 的 Route 提供了很完整的功能可以輕易的完成 RESTful 架構。
基本範例
// 定義參數
Route::get('user/{id}', function ($id) {
return 'User ' . $id;
});
// 多個參數
Route::get('user/{id}/name/{name}', function ($id, $name) {
// do something
});
// Optional 參數,變數後面加上 ? 字符就可以變成 optional 的參數,但相對的是要再設定預設值。
Route::get('/list/user/{page?}', function ($page = 1) {
return $page;
});
Route Groups
在一般的網站應用中,一定會有數個頁面是屬於同性質甚至有著相似的 URL,透過 Route Groups 可以批次處理這些 routes。
// 設定 URL Prefix
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// "/admin/users" URL
});
Route::get('list', function () {
// "/admin/list" URL
});
});
// 設定 Controller Namespace
Route::namespace('Admin')->group(function () {
// Controllers 預設 Namespace 為 "App\Http\Controllers\Admin"
// 在此 group 裡面的定義就不用寫成 Admin\Controller
Route::get('/test', 'TestController@test');
});
// 設定 Middleware
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// 使用 first 和 second 這兩個 Middleware
});
});
// 同時使用 namespace 及 prefix
Route::namespace('Admin')->prefix('admin')->group(function () {
Route::get('/test', 'TestController@test');
});
// 直接透過 group 的參數設定
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function () {
Route::get('/test', 'TestController@test');
});
Named Routes
在開發中如果有需要轉址或者其他用途,也可以給予 Route 命名再加以應用。
基本使用
Route::get('/user', 'UserController@index')->name('user');
// 在 Controller 中可以取得 url
$url = route('user');
// 透過 redirect method 直接轉址
return redirect()->route('name');
代入參數
Route::get('/user/{id}/profile', 'UserController@index')->name('user');
$url = route('user', ['id' => 1]);