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 () { });
});