Laravel学习笔记基础系列--(六)Laravel控制器的使用

作者: 温新

分类: 【Laravel】

阅读: 1773

时间: 2021-07-03 15:15:29

作者:温新

时间:2021-06-24

上一篇文章介绍了路由的使用。大家有没有发现我们所有的返回信息都是写路由的闭包里面。实际开发中,也不会将一大串逻辑写代码写在路由中。有一个更好的方法来处理,那就是路由控制器。

路由控制器

用法:Route::get('url','XxxController@控制器方法);

其用途就是将相关操作映射到对应的控制器中的某个方法。实际开发中就是这样的写法。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// web.php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">// 将url为demo地址映射到DemoController控制器的index方法</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)">'demo'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'DemoController@index'</span>);</span>

如此,控制器就定义好了,万事俱备,只欠东风了。下面来看看关于控制器操作。

控制器

Laravel中的控制器都存放在app/Http/Controllers目录下。控制器分为基础控制器与资源控制器。定义控制器有2种方法,手动创建与命令创建,推荐命令创建。因此,不会演示手动创建。

基础控制器

artisan关键命令:make:controller

用法:php artisan make:controller XxxController 创建基础控制器

php artisan make:controller DemoController

该命令执行后,会在app/Http/Controllers目录下生成DemoController.php文件,其内容如下:

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// DemoController.php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">namespace</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">App\Http\Controllers</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Http\Request</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">class</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">DemoController</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">extends</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Controller</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>

一定要多敲命令。不要觉得命令长,不敲。到了后面你会爱上她。

添加index方法

控制器类有了,那么定义路由控制器中所需要的index方法。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// DemoController.php</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)">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)">index</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(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>

现在在浏览器中访问就会看到显示路由控制器初体验的内容了。

需要注意的是,在方法中返回数据是使用return,echo,print就不使用了。

资源控制器

用法一,基础资源控制器:php artisan make:controller XxxController --resource

用法二,指定模型资源控制器:php artisan make:controller XxxController --resource --model=Xxx

说明:加上--model是为该控制器指定模型文件,若模型不存在,则自动创建

创建基础资源控制器

第一步:创建资源路由

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// web.php</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)">resource</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'demo1'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Demo1Controller'</span>);</span>

第二步:创建资源控制器

php artisan make:controller Demo1Controller --resource

由于资源控制器生成的内容太多,这里不进行展示。创建完成后,自己打开文件查看内容。

查看资源控制器的路由使用

资源路由器定义好了,该怎么使用?如下是资源路由处理的规则,必须按照此规则来处理。

可以通过php artisan route:list查看资源路由url

创建指定模型的资源控制器
php artisan make:controller Demo2Controller --resource --model=Demo2

该命令生成控制器的同时会生成对应的模型文件。

使用部分资源路由

有时候我们使用不到那么多资源路由,仅仅使用到index、show,那么可以使用only进行限制,反之,除了这两个路由之外,其它路由都使用,可以用except进行限制。

<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)">resource</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'demo1'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Demo1Controller'</span>, [<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'only'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span>[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'index'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'edit'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'show'</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(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">resource</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'demo1'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Demo1Controller'</span>, [<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'except'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span>[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'index'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'edit'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'show'</span>]]);</span>

依赖注入

Laravel中可以在控制器的构造方法中注入依赖也可以在控制器方法中注入依赖。依赖注入好用又好玩,有了依赖注入,应该大力使用依赖注入,而不是使用老旧的方法。

构造函数中依赖注入

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// DemoController.php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">namespace</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">App\Http\Controllers</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">App\Models\User</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">class</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">DemoController</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">extends</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Controller</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(119, 0, 136)">private</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"></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)">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)">__construct</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">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><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$this</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">user</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</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><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(170, 85, 0)">// DemoController.php</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)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Http\Request</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></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)">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)">store</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">Request</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</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)">dd</span>(<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">all</span>());</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>

关于控制器的记录记就到这里,更多方法请参考官方文档。

我是温新

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

请登录后再评论