1.基本路由
路由定義在routes目錄下,路由執行是在控制器之前,
路由路徑 routes目錄下
api.php 關於接口路由定義
文件包含的路由位於 api 中間件組約束之內,支持頻率限制功能,這些路由是無狀態的。所以請求通過這些 路由進入應用需要通過 token 進行認證並且不能訪問 Session 狀態。
channle.php 面板
文件用於注冊應用支持的所有事件Broadcast。
console.php 控制台定義
文件用於定義所有基於閉包的控制台命令。每個閉包都被綁定到一個控制台命令並且允許與命令行IO方法進行 交互。盡管這個文件並不定義HTTP路由,但是它定義了基於控制台的應用入口
web.php 所有的網站請求路由
2.路由類型定義:
Route::get("hello","HelloConroller@hello");
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
// 匹配 post 類型的請求方式
// 匹配 put 類型的請求方式
// 匹配 patch 類型的請求方式 // 匹配 delete 類型的請求方式 // 匹配 options 類型的請求方式
有的時候你可能需要注冊一個可響應多個 HTTP 請求的路由,這時你可以使用 match 方法,也可以使 用 any 方法注冊一個實現響應所有 HTTP 請求的路由:
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
// 匹配 post 類型的請求方式
// 匹配 put 類型的請求方式
// 匹配 patch 類型的請求方式 // 匹配 delete 類型的請求方式 // 匹配 options 類型的請求方式
Route::match(['get', 'post'], '/', function () { // 代碼邏輯 });
Route::any('/', function () { // 代碼邏輯 });
CSRF 保護:
指向 web 路由文件中定義的 POST 、 PUT 或 DELETE 路由的任何 HTML 表單都應該包含 一個 CSRF 令牌字段,否則,這個請求將會被拒絕。如果你希望設置一組不需要的 CSRF 保護的 URL, 可以通過將這類 URL 添加到 VerifyCsrfToken 中間件的 $except 屬性來排除對這類路由的 CSRF 保 護,如下所示:
class VerifyCsrfToken extends Middleware
{
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
* CSRF驗證被排除在外的URI
* @var array
*/
protected $except = [
"http://test.laravel6.com:8002/foo",
"http://test.laravel6.com:8002/index",
//
];
}
路由重定向:
Route::redirect 默認會返回狀態碼 302 。 你可以通過第三個參數自定義返回碼:
Route::redirect('/here', '/there', 301);
視圖路由:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']); 向視圖傳參
路由參數:
在路由中捕獲一些 URL 片段。
例如,從 URL 中捕獲用戶的 ID,可以通過定義路由參數來執行 此操作
Route::get('user/{id}', function ($id) { return 'User '.$id;
});
定義多個參數,路由的參數通常都會被放在 {} 內,並且參數名只能為字母, 同時路由參數不能包含 - 符號,如果有需要,可以用下划線(_)代替。路由參數會按順序依次被注入 到路由回調或者控制器中,而不受回調或者控制器的參數名稱的影響。
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { });
可選參數:
可能需要指定一個路由參數,但你希望這個參數是可選的。你可以在參數后面加上 ? 標記來 實現,但前提是要確保路由的相應變量有默認值:
Route::get('user/{name?}', function ($name = null) { return $name; });
路由正則表達式約束:
Route::get('user/{name}', function ($name) { })->where('name', '[A-Za-z]+');
Route::get('user/{id}/{name}', function ($id, $name) { })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
路由全局約束:
希望某個具體的路由參數都遵循同一個正則表達式的約束,就使用 pattern 方法在
RouteServiceProvider 的 boot 方法中定義這些模式
/**
* 定義你的路由模型綁定, pattern 過濾器等。 *
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
// 一旦定義好之后,便會自動應用這些規則到所有使用該參數名稱的路由上: Route::get('user/{id}', function ($id) { // 只有在 id 為數字時才執行 });
路由命名:
路由命名可以方便地為指定路由生成 URL 或者重定向。通過在路由定義上鏈式調用 name 方法可以指 定路由名稱:
Route::get('user/profile', function () {})->name('profile');
// 你還可以指定控制器行為的路由名稱:
Route::get('user/profile', 'UserProfileController@show')->name('profile');
生成制定路由的url:
為路由指定了名稱后,就可以使用全局輔助函數 route 來生成鏈接或者重定向到該路由
生成 URL... $url = route('profile');
生成重定向... return redirect()->route('profile');
route()函數可以寫在視圖模板中,生成url地址
// 如果是有定義參數的命名路由,可以把參數作為 route 函數的第二個參數傳入,指定的參數將會自動 插入到 URL 中對應的位置:
Route::get('user/{id}/profile', function ($id) { })->name('profile');
$url = route('profile', ['id' => 1]);
檢查當前路由:
判斷當前請求是否指向了某個命名過的路由,你可以調用路由實例上的 named 方法。
例如,你可以在路由中間件中檢查當前路由名稱:
public function handle($request, Closure $next)
{
dd($request); 打印request請求
if ($request->route()->named('profile')) { //
}
return $next($request);
}
路由中間件:
給路由組中所有的路由分配中間件,可以在 group 之前調用 middleware 方法,中間件會依照它們 在數組中列出的順序來運行:
1.1 創建路由 php artisan make:middleware CheckRoute
1.2 Kernel.php protected $routeMiddleware 數組中添加中間件映射,不做映射中間件不會被引入
'checkRoute' => \App\Http\Middleware\CheckRoute::class,
public function handle($request, Closure $next)
{
// 1.要想此路由中間件檢測 路由名稱是否存在,需要在 kernel.php 做映射
// 2. middleware("name") 方法檢測
dd($request->route());
if($request->route()->named("ffff"))
{
dd($request);
return false;
}
return $next($request);
}
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () { // 使用 first 和 second 中間件 });
Route::get('user/profile', function () { // 使用 first 和 second 中間件});
});
路由命名空間:
使用namespace方法將相同的PHP命名空間分配給路由組的中所有的控制器,請注意,默認情況下,RouteServiceProvider會在命名空間組中引入你的路由文件,讓你不用指定完整的App\Http\Controllers命名空間前綴就能注冊控制器路由。因此,你只需要指定命名空間App\Http\Controllers 之后的部分。
Route::namespace('Admin')->group(function () {
// 在 「App\Http\Controllers\Admin」 命名空間下的控制器
});
子域名路由:
路由組也可以用來處理子域名。子域名可以像路由URI一樣被分配路由參數允許你獲取一部分子域名作為參數給路由或控制器使用。可以在定義group之前調用 domain 方法來指定子域名:
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) { });
});
路由前綴:
可以用 prefix 方法為路由組中給定的 URL 增加前綴。
例如,你可以為組中所有路由的URI 加上 admin 前綴:
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// 匹配包含 /admin/users 的 URL
});
});
路由名稱前綴:
name()方法可以用來給路由組中的每個路由名稱添加一個給定的字符串.
例如,您可能希望以home為所有分組路由的名稱加前綴
// name("home.")模塊 namespace("Home") 命名空間下 HelloController@foo
Route::name("home.")->namespace("Home")->group(function (){
Route::get("HelloController@foo")->name("foo");
});
回退路由:
使用 Route::fallback 方法
你可以定義一個在沒有其他路由可匹配傳入的請求時,才執行的路由。一般來說,未處理的請求會通過應用程序的異常處理程序自動呈現404頁面。但是因為你可以在routes/web.php文件中定義fallback路由,web中間件組中的所有中間件都將應用到路由中。當然,你也可以根據需要向這條路由中添加額外的中間件:
Route::fallback(function () {});
訪問控制:
Laravel 包含了一個中間件,用於控制應用程序對路由的訪問.如果想要使用,請將throttle中間件分配給一個路由或者一個路由組.throttle中間件會接收兩個參數,這兩個參數決定了在給定的分鍾數內可以進行的最大請求數。
例如,讓我們指定一個經過身份驗證並且用戶每分鍾訪問頻率不超過60次的路由組:
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () { });
});
動態訪問控制:
你可以根據已驗證的User模型的屬性,指定動態請求的最大值。
例如,如果你的User模型包含rate_limit屬性,則可以將屬性名稱傳遞給throttle 中間件,以便它用於計算最大請求數:
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () { Route::get('/user', function () { });
});
獨立訪客和認證用戶的訪問控制:
您可以為訪客和經過身份驗證的用戶指定不同的訪問控制。
例如,可以為訪客指定每分鍾最多10次請求,為認證用戶設置每分鍾最多60次請求:
Route::middleware('throttle:10|60,1')->group(function () { });
您還可以將此功能與動態訪問控制相結合。
例如,如果User模型包含一個rate_limit屬性,您可以將該屬性的名稱傳遞給throttle 中間件,以便用於計算認證用戶的最大請求數:
Route::middleware('auth:api', 'throttle:10|rate_limit,1')->group(function () { Route::get('/user', function () { });
});