Laravel学习笔记基础系列--(五)Laravel路由的进一步使用

作者: 温新

分类: 【Laravel】

阅读: 1596

时间: 2021-07-01 16:28:44

作者:温新

时间: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;
});

关于更多方法,请参考官方文档。

我是温新

每天进步一点点,就一点点

请登录后再评论