欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Laravel 5:控制器 有大用

shiping1 的头像

介绍一下 Laravel 里的控制器。
来自 
http://ninghao.net/course/3258#info



控制器
路由定义了应用跟用户之间的接口,也就是一些可以访问的地址,用户可以请求这些地址,我们的应用可以做出不同的反应。在处理用户请求的时候,可能需要大量的逻辑运算,决定做什么,不做什么,怎么去做。这些东西,我们最好不要把它都放到路由里面 .. 可以把它们放到一种做控制器的东西里 ... 也就是下面我们要介绍的 Controller .. 中文可以翻译成控制器。

来自 
http://ninghao.net/video/3259#info
基础
基本的控制器

下面我们可以去创建一个控制器,然后用这个控制器里的方法去处理路由的请求。新建一个文件 ... 控制器一般放在 app/Http/Controllers 这个目录的下面 .. 文件的名字就是控制器的名字 .. 比如我们创建一个叫 MovieController 的控制器 ...

先添加一个 php 的开始标记 .. 一个控制器其实就是一个类 ... 我们先给这个类添加一个命名空间 .. 命名空间有点像是类的一个目录 .. 用一个 namespace .. 这个类是在 App\Http\Controllers 这个目录的下面 ... 注意这里用的是反斜线 ..

再去定义一个类... 电影控制器 .. 类的名字就是控制器的名字 .. MovieController .. 控制器类要去继承控制器的基本类 .. 名字是 Controller .. 这个类是在 App\Http\Controllers 这个目录的下面 ..

在控制器的类里面可以去定义很多个方法,然后在路由里面可以使用控制器里的这些方法去处理用户的请求 .. 先添加一个公开的方法 .. 名字是 showMovie .. 可以让它处理显示电影页面的请求 .. 接收一个参数 .. 名字是 $id .

在这个方法里面,先简单的返回一个字符串 .. return .. 电影 .. 再加上这个 $id 参数的值 ... 保存一下 ... 现在我们就定义好了一个控制器,名字是 MovieController,里面有一个方法,名字是 showMovie .. 我们可以在路由里面使用这个控制器里的这个方法去处理用户的请求 ...

来自 http://ninghao.net/video/3261#toc

在路由里使用控制器

打开 app ... Http .. 找到 routes.php .. 在这里我们可以添加一条路由,在这个路由里使用一下在上一个视频里我们定义的 MovieController 这个控制器里的 showMovie 这个方法 ...

使用 Route 的 get 方法 .. 路由的地址是 movie/ 后面加上一个 id 参数 .. 然后它的第二个参数可以是要使用的控制器还有对应的控制器方法 ...

输入一个 MovieController .. 这个是控制器的名字 .. 加上一个 @ 符号 .. 接着是控制器里的方法 .. showMovie .. 注意这里我们使用控制器的时候,没有指定控制器的完整的地址 .. 只是用了一个控制器的名字 ..

保存 .. 打开浏览器 ... 访问一下 movie / 后面随便加上一个 id 参数的值 ... 比如 1 ... 返回的就是 MovieController 这个控制器里的 showMovie 这个方法要返回的东西 .. 也就是一个电影 .. 加上 id 参数的值 ...
来自 http://ninghao.net/video/3262#info

 
控制器与命名空间

在路由里使用 MovieController 这个控制器的时候,我们只用了控制器的名字,没有指定它的具体的位置 .. 这是因为在 app .. Providers 下面的 RouteServiceProvider 里面 ... 在它的这个 map 方法里 .. 载入了 app .. Http 下面的 routes.php ..

注意这里用了一个路由群组 .. 这个群组里的路由都使用了一个统一的命名空间 .. 就是上面的这个 App\Http\Controllers ... 我们用的这个 MovieController 控制器正好在这个命名空间下面 .. 所以在使用它的时候不需要再去具体的指定这个命名空间了 .. 直接用控制器的名字就行了 ...

下面我们可以把这个 MovieController 放到一个目录的下面 .. 选中这个文件 .. 按一下 m .. 把它放到 App\Http\Contyrollers 下面的 Movie 这个目录的下面 ..

打开这个文件 ... 这样我们需要再去修改一下这个控制器的命名空间 .. 在这个 Cop ntrollers 的后面需要再加上一个 Movie ...

因为这个控制器继承了 Controller .. 这个类是在 App\Http\Controllers 目录的下面 .. 所在,在上面, 需要再用一个 use .. 然后是 App\Http\Controllers\Controller ... 这样我们才能在类里面直接使用这个 Controller 类的名字 ...

再打开 routes.php .. 在这个路由里面的控制器名字的前面,我们要再加上一个 Movie\ ...

保存 .. 再回到浏览器 .. 请求一个 movie/3 ... 可以正常显示的返回在 MovieController 控制器里面的 showMovie 方法里面指定的东西 ...
来自 http://ninghao.net/video/3263#info

 
命名控制器路由

打开 MovieController .. 再去添加一个控制器方法 .. 名字是 showMovieList .. 它返回一个 电影列表 ... 再打开 routes.php .. 添加一个新的路由 ..

使用 Route 的 get 方法 .. 地址是 movie ... 第二个参数可以用一个数组 ... 然后先用一个 uses .. 指定一个处理这个路由的请求需要用的控制器的方法 .. 在这个胖胖的箭头的右边设置一下 .. Movie\MovieController@showMovieList ...

逗号分隔一下 .. 这个数组里的第二个项目,用一个 as .. 对应的值就是我们给这个路由起的名字 .. 这里设置成 movie_list ...

路由有了名字以后,我们就可以使用 route 方法得到指定名字的路由里的那个地址 .. 比如我们直接在这个 routes.php 里面 .. 添加一个变量 .. 名字是 url .. 让它等于 route 方法 .. 把路由的名字交给这个方法 .. 这里就是 movie_list ..

然后再用一个 var_dump 输出这个 $url 变量 .. 保存 .. 回到浏览器 .. 打开一个路由的地址 .. 在上面会显示输出的 名字是 movie_list 这个路由的地址 ..

我们还可以使用 action 这个方法 ... 把控制器的方法交给它,可以生成对应的地址 ... 回到编辑器 .. 注释掉这行代码 .. 再用一个 $url .. 等于 action .. 再把一个控制器的方法交给它 .. Movie/MovieController@showMovieList ..

保存 .. 回到浏览器 .. 刷新 .. 这里会输出使用了 MovieController@showMovieList 的那个路由的地址 ...

来自 http://ninghao.net/video/3280#info

 
Implicit Controllers
隐式控制器 - Implicit Controllers

我们可以使用一条路由处理所有的请求的动作,这些动作可以放在一个控制器的类里面,在这个类里的方法需要使用特定的命名方式,首先是 HTTP 动作的名字,比如 get,post 等等,接着是一个地址的名字 .. 这种控制器叫做隐式控制器 .. Implicit Controllers

先打开 routes.php ... 先去掉之前我们定义的路由 ...

使用这种形式的控制器,我们在定义路由的时候要用 controller 这个方法 ... 使用 Route 的 controller 方法 (#ro:c).. 它的第一个参数是一个基本的地址 .. 这里我们设置成 movie .. 第二个参数是一个控制器的名字 .. 这里我们用一下前面定义的 MovieController 这个路由 .. 它在 Movie 这个目录的下面 ..

Route::controller('movie', 'Movie\MovieController');

再打开这个 MovieController 控制器 .. 删除掉之前定义的两个方法 ... 添加一个新的方法 .. 方法的名字的一开始要使用 http 的动作 .. 输入一个 get .. 它后面是用标题表示的地址的一部分 .. 这里用一个 Index .. 这个控制器的方法处理的就是访问路由地址的根的时候用的 .. 直接使用 get 方法请求 movie 这个地址的时候,会使用这个方法去处理 ...

在它里面,返回一个 '电影列表' ...

再去定义一个方法,它可以处理对个别电影内容的请求 .. 方法的名字是 getShow .. 这个方法可以接受一个参数 .. 名字是 id .. 方法返回 电影 .. 再加上这个 id 参数的值 ..

这个方法在用 get 去请求 movie/show 的时候会用到。

再添加一个方法 ... 名字是 getTop100 ... 返回一个 电影 Top100 .. 最后再去添加一个可以处理 post 方法请求的地址 .. 名字是 postAdd .. 方法返回 发布电影 ...

保存 .. 下面我们可以到 postman 这个工具上去试一下 ... 先请求一下 movie 这个地址 .. 方法选择 get ... 发送 ... 返回的是电影列表 .. 再请求一下 movie/show/3 ... 这个请求会用到 MovieController 里面的 getShow 这个方法去处理 .. 返回的就是 电影 .. 后面加上 id 这个参数的值 ..

再试一下,使用 get 方法请求 movie/top100 .. 结果就是 电影 Top 100 ..

最后再试一下请求 movie/add .. 这次请求的方法我们可以使用 post .. 点击发送 .. 返回的是 发布电影 .. 它就是 postAdd 这个方法里面要返回的东西。

来自  http://ninghao.net/video/3265#info

Resource Controllers
RESTful 资源控制器 - Resource Controllers

Resource 控制器,就是资源控制器,它可以让我们围绕应用里的某种资源去创建一个控制器,比如用户,电影,新闻,博客。这些资源可能都会对应一些特定的请求的动作,比如得到电影的列表,某个特定的电影内容,发布,编辑,还有删除电影等等。使用资源控制器去创建处理这些请求的方法非常非常的方便。

Laravel 提供了一个命令行工具,可以很方便的去创建资源类型的控制器 ... 我们先删除掉之前创建的 MovieController .. 直接删除掉整个 Movie 目录 ..

再打开 routes.php .. 删除掉使用了 MovieController 这个控制器的这条路由 ...

然后回到命令行工具 .. 登录到虚拟机 ...

进入到 Laravel 项目所在的目录 .. /vagrant/app/laravel-5 .. 输入 php artisan ,使用 make:controller 这个命令,

 ( php artisan make:controller MovieController )
 


可以去创建资源控制器 .. 它的后面是控制器的名字 .. 我们还是创建一个可以处理电影资源用的控制器 .. 名字是 MovieController ... 执行一下 ...

回到编辑器 .. 打开 App\Http\Controller .. 在这个目录的下面,这个 MovieController.php 就是刚才我们使用命令创建的资源控制器 ..

这里已经给我们添加了合适的命名空间 ... 还有一些控制器的方法 ... 下面我们再去了解一下这些方法的意思。

php artisan make:controller MovieController

来自 http://ninghao.net/video/3267#info
 

理解资源控制器里的方法

在这个资源控制器里面,已经给我们定义好了一些方法,这些方法可以处理使用不同 HTTP 方法对不同的地址的请求 .. 先看一下这个 index 方法 ... 如果使用这个资源控制器的路由,定义的基本的地址是 movie 的话,这个 index 方法处理的就是使用 GET 方法请求 movie 这个地址用的 ..

一般就是去显示一个资源的列表 .. 这里就是电影的列表 .. 这里返回一个 电影列表 ... 下面有一个 create 方法 .. 它是处理请求创建资源用的表单的一个方法 .. 使用 get 方法,访问资源地址斜线 create 的时候会用到它 ..

在这个方法里,返回一个 '创建电影用的表单' ..

下面的这个 store 方法是发布资源用的 .. 使用 post 方法,请求资源地址的时候,会用到这个方法 .. 在它里面,先返回一个 发布电影 ..

show 这个方法可以显示某个特定的资源 .. 这里就是显示某个特定的电影内容 .. 它可以接收到一个 id 参数 .. 在这个方法里,我们可以使用这个参数去到数据库里得到对应的电影内容 ...

让它返回一个 电影 .. 再加上这个参数的值 ...

在这个 edit 方法里面,我们可以返回一个编辑资源用的一个表单 .. 使用 get 方法访问资源地址斜线资源 id 斜线 create 这个地址的时候,会用到这个方法去处理 ... 在它里面返回一个 编辑电影用的表单 .. 再加上 id 参数的值 ..

使用 put 或者 patch 方法请求资源地址斜线斜线 id 的时候,就是编辑资源的请求,处理这种请求可以放到这个 update 方法里面 .. 在这里返回一个 更新电影 .. 后面加上想要编辑的电影的 id 号 ..

删除资源的请求,要使用 destroy 这个动作去处理 .. 使用 delete 方法请求资源地址斜线资源 id 的时候,会用到这个方法 .. 返

来自 http://ninghao.net/video/3268#info

使用资源控制器

下面我们再去添加一条路由,然后用一个这里创建的这个 MovieController 资源控制器 .. 打开 routes.php .. 使用资源控制器的路由,可以用 Route 的 resource 这个方法去定义 ...

它的第一个参数是资源的一个基本的地址 .. 这里设置成 movie .. 然后是控制器的名字 .. 输入一个 MovieController .. 保存 .. 再到 postman 上去试一下 ..

请求一下 movie 这个地址,它就是资源的一个基本的地址 .. 请求用的 HTTP 方法选择 get .. 点击发送 ... 返回的就是 电影列表 .. 资源控制器里 index 方法要返回的东西 ..

再请求一下 movie/create .. 方法同样是 get .. 发送请求 .. 返回的是创建电影用的表单 .. 这是资源控制器里 create 方法要返回的文字 ..

这次使用 post 方法 .. 请求一下 movie 这个地址 .. 返回的是发布电影 ... 它是 store 方法返回的东西 ..

再去请求一个特定的资源 .. movie/3 ... 方法选择 get .. 这次返回的就是 电影 .. 后面是参数的值 .. 这种请求是资源控制器里 show 这个方法处理的 ..

在这个地址的后面加上一个 edit .. 方法选择 get .. 这里会显示一个 编辑电影用的表单 ... 它是 edit 方法里面要返回的东西 ..

这次请求的方法选择 put ... 请求的地址是 movie/3 .. 发送请求 .. 返回的内容是 更新电影 3 .. 这种请求用的是资源控制器里的 update 这个方法处理的 ..

最后再试一下使用 delete 这个方法,再去请求一下这个 movie/3 .. 结果就是 删除电影 3 .. 这里就是资源控制器里的 destroy 这个方法要返回的东西 ...
来自 http://ninghao.net/video/3269#info

使用资源控制器里的部分方法

资源控制器里面有很多方法,我们在路由里面,可以去指定一下想要使用或者不想使用的资源控制器里的方法。 打开 routes.php ,找到这个 resource 路由 .. 再给它添加一个参数 .. 它的值是一个数组 ...

指定想要使用的方法可以用一个 only .. 对应的值又是一个数组 .. 数组里的东西就是想要使用的资源控制器里的方法的名字 ..

添加一个 index ... 逗号分隔一下 ... 再用一个 show .. 这样在 MovieController 这个资源控制器里面,除了 index 还有 show 这两个方法可以使用以外 .. 其它的方法就都不能用了 ..

打开 postman 去试一下 .. 先用 get 请求一下 movie 这个地址 .. 可以正常返回内容 .. 再请求一下 movie/1 .. 也可以返回内容 .. 再把 get 换成 put ... 这次就出错了 .. 因为我们在路由里面限定了可以使用的资源控制器里的方法 ..

再回到 routes.php .. 我们把这个 only 换成 except .. 这个意思就变成了 .. 除了 index ,还有 show 不能用以外 .. 其它的方法都可以使用 ..

再到 postman 上去试试 ... 使用 put 方法请求一下这个地址 .. 可以正常返回内容 ... 再试一下用 get 方法请求这个地址 .. 出现了错误 .. 再请求一下 movie ... 同样会返回错误页面 ...

因为在路由里去掉了 MovieController 里面的 index,还有 show 这两个方法 ...

来自  http://ninghao.net/video/3270#info

 


普通分类: