HTTP 控制器

简介

控制器允许你将相应的路由业务逻辑封装在控制器类中进行有效的管理,这样你不必将所有的路由逻辑集中到routes.php文件中,导致代码的臃肿与难以维护。所有的控制器类都被存储在app/Http/Controllers目录中.

基本控制器

一个基本的控制器应该继承自App\Http\Controllers\Controller控制器类: User::findOrFail($id)]); }}`

我们可以通过下面的方式把控制器的行为分配到路由: Route::get('user/{id}', 'UserController@showProfile');

一旦将控制器的行为分配到路由之后,每次客户端请求该路由,都会触发控制器的行为。这里即客户端每次请求user/{id}路由,showProfile方法都会被执行,路由中的参数也会被直接传递到该方法中.

控制器 & 命名空间

你应该知道我们在定义控制器路由时是不需要指定控制器的命名空间的,而只需要指定到类名就可以了,这是因为在RouteServiceProvider文件中自动加载的routes.php文件已经被指定了路由组的根命名空间App\Http\Controllers;

如果你想在App\Http\Controllers目录下使用php命名空间来嵌套或组织控制器,那么你只需要简单的指定相对于App\Http\Controllers部分的类名就可以了。所以如果你的控制器的全部类名为App\Http\Controllers\Photos\AdminController,那么你就可以这样来定义控制器路由: Route::get('foo', 'Photos\AdminController@method');

命名控制器路由

就像定义命名路由一样,我们也可以给一个控制器路由命名: Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

一旦你为一个路由进行了命名, 那么你就可以通过route帮助方法去快速的生成被命名路由的资源表述地址: $url = route('name');

控制器中间件

中间件可以这样被分配到控制器路由中: Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile']);

当然你也可以在控制器类中直接使用middleware方法来进行中间件的分配,你也可以只允许类中的某些行为受到指定中间件的约束: class UserController extends Controller { public function __construct() { $this->middleware('auth'); $this->middleware('log', ['only' => [ 'fooAction', 'barAction' ]]); $this->middleware('subscribed', ['except' => [ 'fooAction', 'barAction' ]]); }}

RESTful 资源控制器

资源控制器可以使你快速的构建RESTful型的控制器。你可以使用artisan命令来快速的创建: php artisan make:controller PhotoController --resource

该命令会生成app\Http\Controllers\PhotoController.php文件,资源控制器中将包含每个可用的资源操作相应的方法.

你可以通过下面的方式来进行资源路由的注册: Route::resource('photo', 'PhotoController');

这一个简单的声明会创造多条路由用来处理RESTful式的请求.相应的通过命令生成的资源型控制器也为这些请求设置了对应的处理方法.

资源控制器所处理的行为 请求方式 路由地址 控制器行为 路由命名

GET /photo index photo.index

GET /photo/create create photo.create

POST /photo store photo.store

GET /photo/{photo} show photo.show

GET /photo/{photo}/edit edit photo.edit

PUT/PATCH /photo/{photo} update photo.update

DELETE /photo/{photo} destroy photo.destroy

部分资源路由

有时候你可能并不想控制器处理全部的请求方式,那么你可以这么做: Route::resource('photo', 'PhotoController', ['only' => [ 'index', 'show']]);Route::resource('photo', 'PhotoController', ['except' => [ 'create', 'store', 'update', 'destroy']]);

命名资源路由

默认的,所有的资源控制器行为都被进行了相应的路由命名,你可以通过names参数来进行重命名: Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build']]);

命名资源路由参数

默认的,资源路由的路由参数都被命名为相应的资源名称,你可以用过parameters参数来进行重命名: Route::resource('user', 'AdminUserController', ['parameters' => [ 'user' => 'admin_user']]);// /user/{admin_user}

有时候你可能希望资源路由的路由参数并不需要像默认的资源名称一样采取复数的形式,那么你可以通过传递parameters的选项设置为singular: Route::resource('users.photos', 'PhotoController', [ 'parameters' => 'singular']);// /users/{user}/photos/{photo}

另外,你也可以全局设置你的资源路由参数为单数形式或者全局进行资源路由参数的命名映射: Route::singularResourceParameters();Route::resourceParameters([ 'user' => 'person', 'photo' => 'image'])

当你对资源路由参数进行定制时,你应该清楚的知道命名的顺序优先级: 参数被直接的传递给Route::resource

通过 Router::resourceParameters 进行全局参数映射

通过parameters数组选项传递给Route::resource 或者 通过 Route::singularResoureParameters 进行单数形式参数设置

默认行为

资源控制器中意外的行为

如果你必须在资源控制器中添加额外的行为去注册相应的路由,那么你一定要在使用Route::resource之前进行注册,否则该行为很可能会被资源控制器意外的覆盖掉. Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');

依赖注入 & 控制器

构造器注入

laravel的服务容器支持所有的laravel控制器的解析。由于这个原因,所以你可以在控制器的构造函数中添加你所需要依赖的相应类型提示,这些依赖会被自动的解析并注入进控制器实例. users = $users; }}

当然,你也被允许添加一些laravel contract的类型提示,只要服务容器能够正确的解析,你都可以被允许添加。

方法注入

除了在构造函数中进行依赖注入,你也可以在控制器的行为方法中进行依赖注入,比如,将Illuminate\Http\Reqeust实例注入到控制器的store方法中: input('name'); }}

如果你的控制器方法也接收从路由传递过来的参数,那么他们会在其它依赖解析完毕之后被传递,比如你的路由是这么定义的: Route::put('user/{id}', 'UserController@update');

那么你可以这么修正你的控制器行为,来进行参数的接收: 缓存路由 注意:缓存路由不支持闭包函数定义的路由,如果你想使你的路由被缓存,那么你应该使用控制器来管理你的路由.

如果你所有的路由都是基于控制器的路由,那么你应该使用laravel推荐的缓存路由,你可以简单的通过artisan命令来缓存所有路由注册到同一个文件里,它会替代routes.php文件被解析,使用这种缓存注册路由的方式在某些情况下注册路由的时间将被大大的减少,从而提高了应用的响应速度。但是每次添加新的路由或者删除路由时,为了使路由生效,你需要重新生成一次缓存路由: php artisan route:cache

你可以通过下面的方式去删除路由缓存: php artisan route:clear

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php控制器教程,laravel基础教程 -- 控制器相关推荐

  1. 全国电子商务人才专业化从业认证考试初级教程(公共基础教程)(全国电子商务人才丛业能力教育指定教材)

    书名:<全国电子商务人才专业化从业认证考试初级教程(公共基础教程)>(全国电子商务人才丛业能力教育指定教材) 作者:单兴华 组编:全国电子商务人才从业能力教育项目管理办公室 出版社:中国人 ...

  2. [转载]VBS入门教程 VBS基础教程

    [转载]VBS入门教程 VBS基础教程(收藏) VBS基础教程 VBS(VBScript的进一步简写)是基于Visual Basic的脚本语言. Microsoft Visual Basic是微软公司 ...

  3. 14-(基础入门篇)关于系统教程和基础教程后期规划

    https://www.cnblogs.com/yangfengwu/p/9966901.html 系统教程:现在的系统教程已经写完源码,还没配教程,现在买只能给源码哈 系统教程初步要做到的就是12节 ...

  4. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  5. 计算机应用新教程,计算机应用基础教程(新)-李久仲 第1单元 计算机基础知识

    计算机应用基础教程(新)-李久仲 第1单元 计算机基础知识 (72页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 第1单元 计算机基础知识 ...

  6. python语言教程-Python 基础教程

    Python基础教程 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Pe ...

  7. sql基础教程mysql_SQL基础教程(第2版)笔记整理

    花了一段时间把SQL基础教程(第2版)看完,并把笔记整理好. 数据定义语言(Data Define Language) 数据操作语言(Data Manipulation Language) 数据控制语 ...

  8. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用

    对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...

  9. html5语言基础教程,HTML5基础教程,从入门到精通,零基础学HTML5

    随着互联网的快速发展,对前端开发方面的人才需求越来越大,其中Web前端领域的HTML5也受到许多人追捧 HTML5是构建Web内容的一种语言描述方式.HTML5是互联网的下一代标准,是构建以及呈现互联 ...

最新文章

  1. new star program
  2. QT的QMediaControl类的使用
  3. B4010 菜肴制作 拓扑排序(附随机跳题代码)
  4. crf与bitrate对照表
  5. 逻辑综合——施加约束
  6. 目录爆破工具 -- dirsearch
  7. spring boot 分布式锁组件 spring-boot-klock-starter
  8. 【Java】计算一组同学一门课程的平均成绩、最高成绩和最低成绩
  9. 局域网计算机维护工具,教你用“小浣熊局域网维护小工具”,从此解脱烦恼!...
  10. Linux基本常用命令
  11. 计算机专业知识面狭窄,计算机专业知识
  12. linux mysql libc.so_Linux libc依赖包问题如何解决?
  13. ActiveMQ下载与安装,无法远程访问控制台
  14. Linux wine系列——Ubuntu20.04安装wine教程 [2021.3]
  15. pysmiles:一个用于读写SMILES表达式的python库
  16. 【渝粤题库】陕西师范大学201611《中国古代文学(四)》作业
  17. python- re模块(正则表达式)
  18. 极米和当贝投影仪应该怎样抉择?一文告诉你答案
  19. 电子学会2023年3月青少年软件编程python等级考试试卷(三级)真题,含答案解析
  20. python如何撤销上一步_python代码运行到某一步能返回到前面某一步吗?

热门文章

  1. 中科大 计算机网络11 应用层原理
  2. 谁在告谁?移动专利混战图
  3. DirectShow系统初级指南
  4. C语言的面向对象设计-对X264/FFMPEG架构探讨
  5. 狗窝里的小日子- 5 ...
  6. 杭电多校 Harvest of Apples 莫队
  7. 【Qt开发】QTableWidget设置根据内容调整列宽和行高
  8. AjaxControlToolkit的使用
  9. 使用抽象类还是接口(Java)
  10. show部分书...