thinkphp5控制器
// 定义应用目录 define('APP_PATH', __DIR__ . '/../app/'); // 定义配置文件目录和应用目录同级 define('CONF_PATH', __DIR__.'/../config/'); // 修改应用类库命名空间(默认是app) 5.08+版本 define('APP_NAMESPACE','app');
定义:
//application\index\controller\Index.php namespace app\index\controller; class Index { public function index() { return 'index'; } } //或者 namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { return 'index'; } }
//application\index\controller\v1\Index.php多级控制器
//controller/aa/bb/User.php 那么遇到url、链接、路由地址等表示控制器的都可以.来链接
//如:url('index/aa.bb.user/add')、https://www.xxx.com/index.php/index/aa.bb.user/add.html、Route:rule('adduser/:id','index/aa.bb.user/add'); namespace app\index\controller\v1; class Index { public function index() { //模板渲染 $view = new View();//必须申明use think\View; return $view->fetch('index'); //或者 return view('index'); } } //或者 namespace app\index\controller\v1; use think\Controller; class Index extends Controller { public function index() { // 获取包含域名的完整URL地址 $this->assign('domain',$this->request->url(true)); //继承Controller的话可以直接调用下面这个 return $this->fetch('index'); } }
配置文件配置这想可以改变默认输出的数据格式(api接口可用到)
// 默认输出类型 'default_return_type' => 'json',
控制器初始化方法:
namespace app\index\controller; use think\Controller; class Index extends Controller { public function _initialize() { echo 'init'; } public function index() { return 'index'; } }
前置操作:
class Index extends Controller { //前置 protected $beforeActionList = [ 'first',//无子数组 调用当前类的方法时都要调用它 'second' => ['except'=>'hello'],//except 表示hello不使用second前置方法 'three' => ['only'=>'hello,data'],//only 表示只有hello,data方法才使用three这个前置方法 ]; public function index() { return $this->fetch('test@index/index'); } public function first() { echo 'first<br/>'; } public function second() { echo 'second<br/>'; } public function three() { echo 'three<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; } }
$this->success('新增成功', 'User/list');//默认的返回页面是$_SERVER['HTTP_REFERER'] $this->error('新增失败');////错误页面的默认跳转页面是返回前一页,通常不需要设置 跳转地址是可选的,success方法的默认跳转地址是$_SERVER["HTTP_REFERER"],error方法的默认跳转地址是javascript:history.back(-1);。 success和error方法都可以对应的模板,默认的设置是两个方法对应的模板都是:THINK_PATH . 'tpl/dispatch_jump.tpl' 即:thinkphp\tpl\dispatch_jump.tpl
改变默认模板:
方法1、在application/tpl文件夹下新建dispatch_jump.tpl和
dispatch_jump.tpl
;然后配置文件配置:
//默认错误跳转对应的模板文件 'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl', //默认成功跳转对应的模板文件 'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
方法2、使用项目内部的模板文件
在view/public/下新建success.html和error.html 然后在配置文件配置
//默认错误跳转对应的模板文件 'dispatch_error_tmpl' => 'public/error', //默认成功跳转对应的模板文件 'dispatch_success_tmpl' => 'public/success',
redirect方法的参数用法和Url::build
使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转
redirect('News/category')->remember();
需要跳转到上次记住的URL的时候使用:
redirect()->restore();
空控制器和空操作阻止控制器和方法不存在时的报错:
1、在模块控制器下定义空控制器类;当控制器不存在时会找到这个空控制器的index方法
<?php namespace app\test\controller; use think\Request; class Error { public function index(Request $request) { $nowController = $request->controller(); echo $nowController; } //空控制器加上空操作是应对控制器和方法都不存在时的情况 public function _empty($name){ echo '操作'.$name . '不存在'; } }
2、将空操作方法定义在每个控制器中或者定义在基类中,然后个控制器继承该基类
public function _empty($name) { return '找不到当前的方法'; }
分层控制器:与controller平级的控制器层
tp默认自带application/controller;分层可以多出和controller一样的控制器层,那么我们可以将controller当做访问控制器层,其他的当做不能够被URL访问直接调用到的,只能在访问控制器、模型类的内部,或者视图模板文件中进行调用的分层控制器;如官网给的例子 application/event控制器层在这个控制器下定义一个Blog类文件
amespace app\index\event; class Blog { public function insert() { return 'insert'; } public function update($id) { return 'update:'.$id; } public function delete($id) { return 'delete:'.$id; } }
调用这个event控制层的Blog类:
$event = \think\Loader::controller('Blog', 'event'); echo $event->update(5); // 输出 update:5 echo $event->delete(5); // 输出 delete:5 //或者: $event = controller('Blog', 'event'); echo $event->update(5); // 输出 update:5 echo $event->delete(5); // 输出 delete:5 //还支持跨模块调用: 其实use命名空间也可以的 $event = controller('Admin/Blog', 'event'); echo $event->update(5); // 输出 update:5
资源控制器在路由有提到:
在访问控制器层controller下有子目录那么我们可以在配置文件配置如下:
'controller_auto_search' => true,
然后定义控制器如下:
amespace app\index\controller\v1; use think\Controller; class Blog extends Controller { public function index() { return $this->fetch(); } }
访问url:http://serverName/index.php/index/v1/Blog/index.html