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

作者: 温新

分类: 【Laravel】

阅读: 1332

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

作者:温新

时间:2021-06-24

本篇文章继续对路由进行记录,在实际开发中用的也是很多的。如路由多了怎么办?仔细去观察所定义的路由,会发现有些共通之处,如前缀。Laravel作为艺术家的框架,替我们考虑到了这点。下面将一些知识点进行简单记录。

路由分组

路由分组(group)需要结合一些特性(如url前缀等)进行使用,否则单独使用group分组,没有多大意义。

路由前缀

prefix抽离出公共前缀,使得路由更加简洁。下面来看看结合分母一起来看看吧。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">prefix</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'admin'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">group</span>(<span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">prefix</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'user'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">group</span>(<span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'a1'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">            <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'a1用户'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        });</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'a2'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">            <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'a2用户'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        });</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    });</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'posts/add'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'添加文章'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    });</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

定义之后可以这样访问:你的域名/admin/**/**进行访问,如访问user路由,你的域名/admin/user/a1

由此可以prefix是共通的路由前缀进行简化。

路由名称前缀

用法:Route::name()

每一个路由都可以为它起一个名称,这也是推荐做法。为路由起名字,生成 url时非常方便。如前端页面写的是路由地址时,当需求发生变化,需要修改路由时,那么不得不修改前端页面路由地址。

若前端页面写的是路由名称时,那么只需要修改web.php中的路由url即可。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">prefix</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'admin'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">name</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'admin.'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">group</span>(<span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'posts/add'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 返回生成的路由地址</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">route</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'admin.posts.add'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    })<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">name</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'posts.add'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

可以看到,有两个name。分离出来的name('admin.')是路由名称前缀,作用是抽离通用的路由名称前缀;name('posts.add')是该路由('posts/add')的路由名称。

需要注意的是,路由名称前缀我这里是admin.带了一个点号。

中间件

用法:Route::middleware()

中间件的作用是拦截请求,符合规则的通过,不符合的规则的打回。此方法引用官方案例,我没进测试。后续写到中间件文章时会有详解介绍。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">middleware</span>([<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'first'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'second'</span>])<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">group</span>(<span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> () {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'/'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> () {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// Uses first & second middleware...</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    });</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

路由模型绑定

当修改我们修改一篇文章时,一般操作是传递文章ID,然后通过写编写相关代码然后对应的文章。在Laravel中,这一步操作可以省略,我们可以通过模型绑定直接获取文章信息。

隐式绑定
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'user/{user}'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">\App\Models\User</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

注意,这里的参数不再是id,而是与模型对应的user,请求地址仍旧传递ID(如:你的域名/user/1),这样就不用编写查询语句直接获取到了对应的用户信息(实际上是Laravel底层帮我们进行了查询)。

注意:回调闭包中通过依赖注入实例了User模型变量$user,路由参数中的user需要与模型变量实例$user保持一致。

自定义查询参数

用法:Route::get('user/user:email');

一般情况下使用id进行查询,但有时需要通过其它字段来查询,Laravel为我们考虑到了这一点。下面是通过用户邮箱来查询用户信息:

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'user/{user:email}'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">\App\Models\User</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

查询时需要带上邮箱才能查询与之符合的信息。

显式绑定

显式绑定使用model方法,在Providers/RouteServiceProvider.php中的boot方法中定义。

第一步:绑定方法

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">boot</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 显式绑定</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">model</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'user'</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\App\Models\User</span>::<span style="box-sizing: border-box;color: rgb(119, 0, 136)">class</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>

第二步:定义路由

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'user/{user}'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">App\Models\User</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$user</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

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

我是温新

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

请登录后再评论