Laravel 5.5 Route
阿新 • • 發佈:2018-11-27
Route(路由)
冪等性:指一次和多次請求某一個資源應該具有同樣的副作用,也就是一次訪問與多次訪問,對這個資源帶來的變化是相同的。
路由動作
動詞 | 描述 | 是否冪等 |
GET | 獲取資源,單個或多個 | 是 |
POST | 建立資源 | 否 |
PUT | 更新資源,客戶端提供完整的資源資料 | 是 |
PATCH | 更新資源,客戶端提供部分的資源資料 | 否 |
DELETE | 刪除資源 | 是 |
注)為什麼 PUT 是冪等的而 PATCH 是非冪等的,因為 PUT 是根據客戶端提供了完整的資源資料,客戶端提交什麼就替換為什麼,而 PATCH 有可能是根據客戶端提供的引數,動態的計算出某個值,例如每次請求後資源的某個引數減1,所以多次呼叫,資源會有不同的變化。
// 支援的請求方式
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
eg:
資源路由
Route::resource('users', 'UsersController');
等同於
Route::get('/users', ' [email protected]')->name('users.index');
Route::get('/users/create', '[email protected]')->name('users.create');
Route::get('/users/{user}', '[email protected]')->name('users.show');
Route::post('/users', '[email protected] ')->name('users.store');
Route::get('/users/{user}/edit', '[email protected]')->name('users.edit');
Route::patch('/users/{user}', '[email protected]')->name('users.update');
Route::delete('/users/{user}', '[email protected]')->name('users.destroy');
// 閉包路由
Route::get('hello', function () {
return 'Hello, Welcome to LaravelAcademy.org';
});
// 指定路由控制器和方法
Route::get('/user', '[email protected]');
// 相應多種http請求
Route::match(['get', 'post'], 'foo', function () {
return 'This is a request from get or post';
});
Route::any('bar', function () {
return 'This is a request from any HTTP verb';
});
// 路由重定向
Route::redirect('/here', '/there', 301); // 在路由定義檔案中直接將路由重定向到另一個路由中
// 路由檢視, 路由直接指向試圖檔案
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => '學院君']);
// 資源路由
Route::resource('posts', 'PostController');
(部分資源路由)
Route::resource('post', 'PostController', ['only' =>
['index', 'show']
]);
Route::resource('post', 'PostController', ['except' =>
['create', 'store', 'update', 'destroy']
]);
(API資源路由)
宣告被 API 消費的資源路由時,你可能需要排除展示 HTML 模板的路由,如 create 和 edit,為了方便起見,Laravel 提供了 apiResource 方法自動排除這兩個路由:
Route::apiResource('post', 'PostController');
(命名資源路由)
預設情況下,所有資源控制器動作都有一個路由名稱,不過,我們可以通過傳入 names 陣列來覆蓋這些預設的名稱:
Route::resource('post', 'PostController', ['names' =>
['create' => 'post.build']
]);
(命名資源路由引數)
預設情況下,Route::resource 將會基於資源名稱的單數格式為資源路由建立路由引數,你可以通過在選項陣列中傳遞 parameters 來覆蓋這一預設設定。 parameters 是資源名稱和引數名稱的關聯陣列:
Route::resource('user', 'AdminUserController', ['parameters' => [
'user' => 'admin_user'
]]);
(補充資源控制器)
如果需要在預設資源路由之外新增額外的路由到資源控制器,應該在呼叫 Route::resource 之前定義這些路由,否則,通過 resource 方法定義的路由可能無意中覆蓋掉補充的額外路由:
Route::get('posts/popular', '[email protected]');
Route::resource('posts', 'PostController');
// 路由引數
(必選引數)
Route::get('user/{id}', function ($id) {
return 'User ' . $id;
});
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
return $postId . '-' . $commentId;
});
(可選引數)
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
(正則約束)
Route::get('user/{name}', function ($name) {
// name 必須是字母且不能為空
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
// id 必須是數字
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
// 同時指定 id 和 name 的資料格式
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
(全域性約束)
如果想要路由引數在全域性範圍內被給定正則表示式約束,可以使用 pattern 方法。需要在 RouteServiceProvider 類的 boot 方法中定義這種約束模式:
/**
* 定義路由模型繫結,模式過濾器等
*
* @param \Illuminate\Routing\Router $router
* @return void
* @translator http://laravelacademy.org
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
// 命名路由
Route::get('user/profile', function () {
// 通過路由名稱生成 URL
return 'my url: ' . route('profile');
})->name('profile');
Route::get('user/profile', '[email protected]')->name('profile');
* 為命名路由生成 URL
$url = route('profile');
$url = route('profile', ['id' => $id]);
* 檢查當前路由
如果你想要判斷當前請求是否被路由到給定命名路由,可以使用 Route 例項上的 named 方法,例如,你可以從路由中介軟體中檢查當前路由名稱:
if ($request->route()->named('profile')) {
//
}
// 路由分組
(中介軟體)
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second Middleware
});
Route::get('user/profile', function () {
// Uses first & second Middleware
});
});
Route::get('/', function () {
//
})->middleware('token');
Route::get('/', function () {
//
})->middleware('token', 'auth');
(名稱空間)
Route::namespace('Admin')->group(function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
(子域名路由)
Route::domain('{account}.blog.dev')->group(function () {
Route::get('user/{id}', function ($account, $id) {
return 'This is ' . $account . ' page of User ' . $id;
});
});
(路由字首)
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
// 路由模型繫結
(隱式繫結)
Laravel 會自動解析定義在路由或控制器動作(變數名匹配路由片段)中的 Eloquent 模型型別宣告,例如(我們將這個路由定義在 routes/api.php 檔案中):
Route::get('users/{user}', function (App\User $user) {
dd($user);
});
* 自定義鍵名
如果你想要在隱式模型繫結中使用資料表的其它欄位而不是 id 欄位,可以重寫 Eloquent 模型類的 getRouteKeyName 方法,以 User 模型為例,可以在該模型類中新增這個方法 :
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'name';
}
http://blog.dev/api/users/username 訪問就可以獲取注入的使用者模型
(顯式繫結)
有隱式繫結,就有顯式繫結。要註冊顯式繫結,可以使用路由器的 model 方法來為給定引數指定繫結類。你需要在 RouteServiceProvider 類的 boot 方法中定義顯式模型繫結:
public function boot()
{
parent::boot();
Route::model('user_model', App\User::class);
}
// 路由eg
$router->get('profile/{user_model}', function(App\User $user) {
dd($user);
});
* 自定義解析邏輯
如果你想要使用自定義的解析邏輯,可以在 RouteServiceProvider 類的 boot 方法中使用 Route::bind 方法,傳遞到 bind 方法的閉包會獲取到 URI 請求引數中的值,並且返回你想要在該路由中注入的類例項:
public function boot()
{
parent::boot();
Route::bind('user', function($value) {
return App\User::where('name', $value)->first();
});
}
// 訪問當前路由
$route = Route::current(); // 獲取當前路由例項
$name = Route::currentRouteName(); // 獲取當前路由名稱
$action = Route::currentRouteAction(); // 獲取當前路由action屬性