Laravel学习笔记基础系列--(五)Laravel路由的进一步使用
作者:温新
时间:2021-06-24
本篇文章继续对路由进行记录,在实际开发中用的也是很多的。如路由多了怎么办?仔细去观察所定义的路由,会发现有些共通之处,如前缀。Laravel作为艺术家的框架,替我们考虑到了这点。下面将一些知识点进行简单记录。
路由分组
路由分组(group)需要结合一些特性(如url前缀等)进行使用,否则单独使用group分组,没有多大意义。
路由前缀
prefix
抽离出公共前缀,使得路由更加简洁。下面来看看结合分母一起来看看吧。
Route::prefix('admin')->group(function(){
Route::prefix('user')->group(function(){
Route::get('a1', function(){
return 'a1用户';
});
Route::get('a2', function(){
return 'a2用户';
});
});
Route::get('posts/add', function(){
return '添加文章';
});
});
定义之后可以这样访问:你的域名/admin/**/**
进行访问,如访问user路由,你的域名/admin/user/a1
。
由此可以
prefix
是共通的路由前缀进行简化。
路由名称前缀
用法:Route::name()
每一个路由都可以为它起一个名称,这也是推荐做法。为路由起名字,生成 url时非常方便。如前端页面写的是路由地址时,当需求发生变化,需要修改路由时,那么不得不修改前端页面路由地址。
若前端页面写的是路由名称时,那么只需要修改web.php中的路由url即可。
Route::prefix('admin')->name('admin.')->group(function(){
Route::get('posts/add', function(){
// 返回生成的路由地址
return route('admin.posts.add');
})->name('posts.add');
});
可以看到,有两个name。分离出来的name('admin.')
是路由名称前缀,作用是抽离通用的路由名称前缀;name('posts.add')
是该路由('posts/add')
的路由名称。
需要注意的是,路由名称前缀我这里是
admin.
带了一个点号。
中间件
用法:Route::middleware()
中间件的作用是拦截请求,符合规则的通过,不符合的规则的打回。此方法引用官方案例,我没进测试。后续写到中间件文章时会有详解介绍。
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
});
路由模型绑定
当修改我们修改一篇文章时,一般操作是传递文章ID,然后通过写编写相关代码然后对应的文章。在Laravel中,这一步操作可以省略,我们可以通过模型绑定直接获取文章信息。
隐式绑定
Route::get('user/{user}', function(\App\Models\User $user){
return $user;
});
注意,这里的参数不再是id,而是与模型对应的user,请求地址仍旧传递ID(如:你的域名/user/1
),这样就不用编写查询语句直接获取到了对应的用户信息(实际上是Laravel底层帮我们进行了查询)。
注意:回调闭包中通过依赖注入实例了User模型变量
$user
,路由参数中的user
需要与模型变量实例$user
保持一致。
自定义查询参数
用法:Route::get('user/user:email');
一般情况下使用id进行查询,但有时需要通过其它字段来查询,Laravel为我们考虑到了这一点。下面是通过用户邮箱来查询用户信息:
Route::get('user/{user:email}', function(\App\Models\User $user){
return $user;
});
查询时需要带上邮箱才能查询与之符合的信息。
显式绑定
显式绑定使用model
方法,在Providers/RouteServiceProvider.php
中的boot方法中定义。
第一步:绑定方法
public function boot()
{
// 显式绑定
Route::model('user', \App\Models\User::class);
}
第二步:定义路由
Route::get('user/{user}', function(App\Models\User $user){
return $user;
});
关于更多方法,请参考官方文档。
我是温新
每天进步一点点,就一点点