ThinkPHP 控制器
控制器
控制器定义
- 手动创建
- 命令行生成
php think make:controller app\index\controller\Test
注意:继承think\Controller
是可选的,但推荐继承,这样可以方便得使用某些方法,比如初始化操作,验证等。
控制器输出
1、默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出
2、默认情况下,控制器的返回输出不会做任何的数据处理,但可以设置输出格式,并进行自动的数据转换处理,前提是控制器的输出数据必须采用return的方式返回
3、设置默认输出类型,比如默认输出类型为JSON:'default_return_type' => 'json'
多级控制器
在开发api
的时候,经常会遇到版本问题,那么可以以开启路由的方式,路由到多级控制器,比如application/index/controller/user/Blog.php
文件
那么可以定义路由Route::get('user/blog','index/user.blog/index');
控制器初始化
1、如果你的控制器类继承了系统控制器基类(\think\Controller)的话,可以定义控制器初始化方法initialize,该方法会在调用控制器的方法之前首先执行,如非必要,不建议直接修改控制器的架构函数。
2、initialize方法不需要任何返回值
前置操作
可以为某个或者某些操作指定前置执行的操作方法,设置
beforeActionList
属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
class Index extends Controller
{
protected $beforeActionList = [
'first',
'second' => ['except'=>'hello'],
'three' => ['only'=>'hello,data'],
];
}
跳转与重定向
1、在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面,系统的
\think\Controller
类内置了两个跳转方法success
和error
,用于页面跳转提示
2、可以改变默认的模板,在应用配置文件中修改dispatch_error_tmpl
,dispatch_success_tmpl
空操作与空控制器
1、空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化
2、空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化
3、空控制器Error是可以定义的,可修改应用配置的empty_controller
选项
分层控制器
除了访问控制器外,我们还可以定义其他分层控制器类,这些分层控制器是不能够被URL访问直接调用到的,只能在访问控制器、模型类的内部,或者视图模板文件中进行调用
比如:app\index\event\Blog
$event = \think\facade\App::controller('Blog', 'event');
echo $event->update(5); // 调用Blog类的update方法
$event = controller('Blog', 'event');
echo $event->update(5); //使用 controller 助手函数实例化类 调用Blog类的update方法
$event = controller('Admin/Blog', 'event');//支持跨模块使用
资源控制器
php think make:controller \app\index\controller\Blog
再配上Router::resource('blog','index/Blog')
资源路由。
控制器中间件
你的控制器需要继承系统的think\Controller类,然后在控制器中定义middleware属性,例如:
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
protected $middleware = [
'Auth' => ['except' => ['hello'] ],
'Hello' => ['only' => ['hello'] ],
];
public function index()
{
return 'index';
}
public function hello()
{
return 'hello';
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接