路由组
路由组允许你在大量路由之间共享路由属性,例如中间件或命名空间,而不需要为每个路由单独定义这些属性。共享属性应该以数组的形式传入
Route::group 方法的第一个参数中
路由组就是说,在定义的路由组里面定义的路由只能被相应的域名访问
如下面这个路由组,domain路由只能被blog.cn域名访问。如blog.com是不能访问的
定义路由组
Route::domain('blog.cn')->group(function () {
//里面是可访问的路由
Route::get('domain', function () {
dd('子域名路由');
});
});
路由前缀
prefix 方法将会为路由组中的每一个 URI 添加前缀
如每个路由前缀都为admin的路由就可以这样写
Route::prefix('admin')->group(function () {
//路由1
Route::get('users', function () {
dd('路由组前缀的users');
});
//路由2
Route::get('artice', function () {
dd('路由组前缀的artice');
});
});
路由名称前缀
name 方法可以为路由组中每一个路由名称添加一个指定的字符串作为前缀。例如,您可以给已经分组的路径添加 admin
的前缀。给定的字符串与指定的路由名称前缀完全相同,因此我们将确保在前缀中提供尾部的 . 字符
由于name方法已经为路由前缀添加了前缀,所以,在使用的时候就可以直接使用路由进行访问,而不需要加前缀
如下面的路由,http://blog.com/orders就可以直接访问,不需要前缀
Route::name('admin.')->group(function () {
Route::get('orders', function () {
dd('路由名称前缀:admin.orders');
})->name('orders');
});
中间件
中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。例如,Laravel 包含一个验证用户身份的中间件。
如果用户未能通过认证,中间件会把用户重定向到登录页面。 反之,用户如果通过验证, 中间件将把请求进一步转发到应用程序中Laravel 自带了一些中间件,包括身份验证、CSRF 保护等。所有的这些中间件都位于 app/Http/Middleware 目录
定义中间件
创建中间件会生成到app/Http/Middleware
php artisan make:middleware CheckAge
前置 & 后置 中间件
中间件是在请求之前或之后执行,取决于中间件本身。例如, 下面的中间件将在应用处理请求之前执行一些任务
应用请求之前–前置中间件BeforeMiddleware
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
应用请求之后–后置中间件AfterMiddleware
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
注册中间件
如果希望中间件生效,那么就需要去注册中间件,中间件都在app\Http\Kernel.php中去注册,
app\Http\Kernel.php里面有全局中间件,路由组中间件,路由中间件
- protected $middleware = []是全局中间件
- 这个是路由组中间件,里面又有web中间件和API中间件 protected $middlewareGroups = [
‘web’ => [],
‘api’=>[]
] - 这个是路由中间件 protected $routeMiddleware = []
比如,在路由中间件中去注册一个中间件
protected $routeMiddleware = [
'check.age'=>\App\Http\Middleware\CheckAge::class,
]
完整使用一个中间件的流程
路由组使用中间件
1.定义一个中间件
有一中间件
public function handle(Request $request, Closure $next)
{
if ($request->age <= 200) {
return redirect('/');
}
return $next($request);
}
2.然后去注册中间件
protected $routeMiddleware = [
'check.age'=>\App\Http\Middleware\CheckAge::class,
]
3.去定义一个使用中间件的路由组
Route::middleware('check.age')->group(function () {
Route::get('m', function () {
dd('年龄符号!');
});
});
如果这个路由不传参数就直接访问,会直接跳转到首页,如:
https://blog.cn/m
如果访问的时候,加上参数,而且参数符合,就通过中间件验证
blog.cn/m?age=201
如果是路由要使用中间件可以这样
Route::get('n', function () {
dd('年龄符合!');
})->middleware('check.age');
如果是多个中间件,这样使用
Route::get('n', function () {
dd('年龄符合!');
})->middleware('check.age','check.num');
当然,也可以使用数组的方式
中间件参数
中间件还可以接收额外的参数。例如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」, 你可以创建一个 CheckRole
中间件,由它来接收「角色」名称作为附加参数
附加的中间参数会在 $next 参数之后传递给中间件
如有一个中间件定义了需要接收参数
public function handle(Request $request, Closure $next,$name)
{
dd($name);
if ($request->age <= 200) {
return redirect('/');
}
return $next($request);
}
定义路由时通过一个 : 来隔开中间件名称和参数来指定中间件参数。多个参数就使用逗号分隔
Route::get('n', function () {
dd('年龄符合!');
})->middleware('check.age:xiaoxin');