参考版本:v10
Laravel 路由配置分为四个文件,都在 /routes 目录下面:
- api.php api 无状态路由,被分配了 api 中间件。
- channels.php
- console.php
- web.php web 应用路由,自动赋予了 SESSION 状态,CSRF 保护功能
路由配置
基本匹配:Route::
加 get,post,put,patch,delete,options 等方法
Route::get($uri, function(){}); //第一种,指向回调方法
Route::get($uri,); //第二种,指向控制器方法
Route::get($uri, 'view_name', ['args'=>'value']); //第三种,指向视图
多个匹配:Route::
加 any,match 方法
Route::any('/', $callback); //匹配任意路由
Route::match(['get', 'post'], $callback); //匹配多种请求
正则匹配
Route::get('/user/{id}', function($id){});
Route::get('/user/{id?}', function(){$id}); //可选参数
Route::get('/user/{id}', function($id){})->where(['id' => '[0-9]+']); //参数过滤,可用除/的所有正则字符
Route::get('/user/{id}', function($id){})->whereNumber('id'); //类型过滤
Route::get('/user/{id}', function(Request $request, $id){}); //参数放在依赖注入后面
Route::pattern('id', '[0-9]+'); //全局设置,可在 RouteServiceProvider->boot() 方法中设定全局路由
伪造请求
<form action="/example" method="POST">
@method('PUT')
</form>
缺省路由
Route::fallback(function(){
//基础路由
});
传入中间件
Route::get('/user', [])
传入依赖
Route::get('/', function(Requset $request){});
匹配模型条件
Route::get('/user/{user:id}', function(User $user){});
在表单中使用 CSRF 保护,只有 web.php 中的路由生效。
<form method="POST" action="/url">
@csrf
</form>
路由组
前缀路由组
Route::prefix('/admin')->group(function(){
//基础路由
});
控制器路由组
Route::controller(Controller::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
中间件路由组
Route::middleware(['foo', 'bar'])->group(function(){
//基础路由
});
子域名路由组
Route::domain('{domain}.example.com')->group(function () {
Route::get('user/{id}', function ($domain, $id) {});
});
路由其它用法
路由跳转
Route::redirect('/here', '/there', 302);
当前路由
Route::current();
当前方法
Route::currentRouteAction();
请求限流
自定义全局限流器:编辑文件 /Provider/RouteServiceProvider.php 的 configureRateLimiting 方法:
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(100);
});
定义限流响应方式:默认返回 429 状态码,如果想要修改:
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(100)->response(function () {
return response('Custom response...', 429);
});
});
定义限流条件:
RateLimiter::for('uploads', function (Request $request) {
return $request->user()
? Limit::perMinute(100)->by($request->user()->id) //根据用户id
: Limit::perMinute(10)->by($request->ip()); //限制IP
});
多种限流条件:
RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(100), //一般限流
Limit::perMinute(3)->by($request->input('email')), //条件限流
];
});
限流指定路由:
Route::middleware(['throttle:uploads'])->group(function () {
//基础路由
});
//如果使用redis缓存,可以在 App\Http\Kernel 中,修改为redis限流器:
//'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class
生成路由缓存
上线生产环境时,为了加速路由响应,应在应用中生成当前路由的缓存,使用:
php artisan route::cache #生成缓存
php artisan route::clear #清除缓存