php控制器教程,laravel基础教程 -- 控制器

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中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

org.apache.jasper.JasperException: Unable to compile class for JSP:

报错信息: org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

关于自增自减运算,很多书籍没有把问题讲清楚,在C语言里是这样的: 1.后置运算:k表示先运算,后自加。 意思是遇到k了,我先把当前的k的值拿来参加运算,后面再去管它的自加。 那么,“后面”后到什么…

什么样的项目经历会让面试官眼前一亮

很多同学都问过我类似的问题: 咱们《C语言也能干大事》中讲的自己动手写windows优化大师、自己动手写计算器等东西只是写着玩的小玩具而已,这些能用来以后找工作时写到简历中的作品吗?看别人的简历写的“图书管理系统”、“教务选课系统”多有…

matlab采样频谱,Matlab对采样数据进行频谱分析

使用Matlab对采样数据进行频谱分析1、采样数据导入Matlab采样数据的导入至少有三种方法。第一就是手动将数据整理成Matlab支持的格式,这种方法仅适用于数据量比较小的采样。第二种方法是使用Matlab的可视化交互操作,具体操作步骤为:File --&g…

链表和顺序表的一些区别

顺序表与链表是非常基本的数据结构,它们可以被统称为线性表。 线性表(Linear List)是由 n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1] 组成的有限序列。…

ANCS推送简介

总体原理 ANCS通过蓝牙BLE 4.0实现,仅支持iPhone 4S及以上且系统版本在IOS 7以上的手机,同时在外设端需要支持蓝牙4.0协议。 1、外设端进行广播,手机打开蓝牙,搜索外设,连接外设,之后进行绑定(这…

好记性不如烂笔头,记录几个常用的Linux操作

作者:老王Shell公共函数库Linux系统里有一些公共的Shell函数库可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目录下有很多脚本都用到了这个函数库,里面提供了很多有用的方法,比如:killproc…

用matlab简单电路模型,基于MATLAB的电路模型仿真应用

基于MATLAB的电路模型仿真应用实验指导书一、实验目的1、掌握采用M文件及SIMULINK对电路进行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模块集的调用、设置方法。3.进一步熟悉M脚本文件编写的方法和技巧。二、实验原理1、通过M文件实现电路仿真的一般仿真步骤为&…

春节期间小游戏同时在线人数最高达2800万人/小时

微信官方发布2018年春节期间微信数据报告:除夕至初五,总共有2,297亿条微信消息,28亿条微信朋友圈成功发出,音视频通话总时长175亿乙分钟。其中,90后用广的消息发送量占总量的42.5%,80后用户25.9%&#xff0…

C语言中* 和

&x是对x变量取地址,也就是返回的是x的地址。 int *i;这里面的*说明变量i是一个指针,存的是一个地址。 而 *i整体代表的是一个数值,例如可以int *i 5 这里整体的*i代表的是5,而i代表的是这个值存储的地址

餐馆的故事-浅析职责链模式

我们在餐馆吃饭的时候,一般都是在拿到菜单后,选择喜欢的菜,然后通知服务员。服务员会将我们的定单交给大厨,大厨可能会亲自去做这道菜,也可能安排给小厨来做,总之,我们不用担心他们没有人做菜&a…

JDBC数据对象存储

一:将查询的结果生成对象,储存在数组中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

个人工作13年的一些人生真实领悟

此文不定期的更新,想起来就写一些,我都忘了我曾经会过什么了。你可能会在许多的文章里看到类似的,但这些是我个人的真实体会。 1 技术服从于业务 此问题以前的一个文章提过,不再多说。 适用于大多数对技术的盲目崇拜者。在绝大…

matlab非齐次方程组的通解,用matlab求非齐次线性方程组的通解?

先向大家介绍一下非齐次线性方程组。所谓非齐次线性方程组就是方程组等号右边的常数项不全为零的线性方程组。全部等于零时,就称为齐次线性方程组。下面我们就讲解一下如何利用matlab快速求非齐次线性方程组的通解。工具/材料matlab电脑操作方法01线性方程组Axb的求…

Linux 终端仿真程序Putty

PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。较早的版本仅支持Windows平台,现在的版本中开始支持各类Unix平台。 用linux作为桌面系统,身为工程师很多时候需要通过Telnet、SSH协议进行远程管理,通过串口进行设备配置。Putty…

Mysql 数据库水平分表 存储过程

数据库存储量达到一定程度的时候,就需要进行分表以减轻检索的消耗。 常用的分表方式包括水平和垂直分表。本次进行的是按照uid进行水平分表。 ##分表思路: 水平分表平均的将数据按照特定方式分配到多个表中。理论上每个表的访问频次和数据量都是同一水平…

中国架构师,名符其实有多少?

先说一下读后感:我前段时间去过几个公司面试架构师,要求还是蛮高的,要熟悉大数据量处理,要熟悉高并发,要熟悉XX体系架构,要能在关键技术上实现突破。总之,架构错了,就啥都错了。呵呵…

粗识静态链表

为了弥补链表在内存分配上的不足,出现了静态链表这么一个折中的办法。静态链表比较类似于内存池,它会预先分配一个足够长的数组,之后链表节点都会保存在这个数组里,这样就不需要频繁的进行内存分配了。 当然,这个方法的…

php用date语句获取时间,关于php date()函数获取时间的设置和使用方法

date()函数是PHP自带的时间函数,可以获取当前服务器的时间echo date(Y-m-d H:i:s); //输出:2020-05-18 11:02:35date()函数中可以使用的字母含义:a-"am"(上午)或者"pm"(下午)A-"AM"或者"PM"Y-年,显示…

Django_form补充

问题1: 注册页面输入为空,报错:keyError:找不到passworddef clean(self): print("---",self.cleaned_data) # if self.cleaned_data["password"]self.cleaned_data["repeat_password"]: …