Laravel学习笔记基础系列--(五)Laravel路由的进一步使用
作者:温新
时间: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>
关于更多方法,请参考官方文档。
我是温新
每天进步一点点,就一点点