29、TP5控制器进阶知识
1、为什么要自定义访问控制器层?
打开惯例配置文件thinkphp/convention.php
,找到url_controller_layer
配置项,这个配置项就是定义访问控制器层的。
其意义在于项目规范。
2、为什么要创建多级的控制器?
首先需要了解什么是多级控制器。
在/application/index/controller
控制器目录下,再创建一级user
目录,在user
目录下创建一个文件/application/index/controller/user/Demo.php
,此时这个控制器Demo
就是多级控制器!
访问方式:http://tp5.com/index/user.demo/index
。
此时的user
是多级可访问控制层的目录名字,和controller
目录其实一个意思。
3、为什么要创建空操作和空控制器?
举例,在/application/index/controller/Index.php
文件中有如下内容:
class Index
{
public function index()
{
return 'TP5学习';
}
public function demo()
{
return '我是index模块index控制器中的demo方法';
}
}
我们用url
访问:http://tp5.com/index/index/test
,会报错方法不存在。
而再加入这个方法后,就不一样了:
public function _empty($method)
{
return '你访问的方法'.$method.'不存在!';
}
当你再用url
访问:http://tp5.com/index/index/test
访问是,就会提示你访问的方法test不存在!
了。
同样的,当你访问一个不存在的控制器时:
http://tp5.com/index/demo/test
,也会报错控制器不存在。如何解决呢,就是通过设置空的控制器,当我们访问不存在的控制器时,就会自动触发。在惯例配置文件中可以看到默认的空控制器名配置项:
empty_controller
,默认叫Error
。我们在当前默认模块控制器下创建这个Error
控制器:/application/index/controller/Error.php
,写入:
<?php
namespace app\index\controller;
class Error
{
public function test()
{
return '我是当前访问控制器中的test方法';
}
}
当你再访问一个不存在的控制器时:http://tp5.com/index/demo/test
,就会跳转到Error
控制器中的test()
方法了。
那么如果访问的方法不是test
呢,又会报错方法不存在,解决的方法很简单,结合上一个空方法的操作就能解决。
那么这个空控制器和空操作的作用是是什么呢?它主要是对不存在的url
访问进行拦截的,你可以在这里面做一些很意思的操作。
4、在控制器中使用trait
有什么好处?
PHP的面向对象编程,是基于单继承的,我们使用trait
技术可以突破这种限制,实现代码复用。
trait
其实是一种特殊的类。
我们的默认模块的默认控制器是没有继承任何父类,如果说要使用父类的一些方法,例如/thinkphp/library/traits/controller/Jump.php
的success()
方法;
可以使用use
关键字导入一个trait
类库使用:use \traits\controller\jump;
;
这样相当于把Jump.php
的代码导入到了默认模块的控制器中,然后写上demo()
方法:
class Index
{
use \traits\controller\jump;
public function index()
{
return 'TP5默认方法';
}
public function demo($name)
{
if ($name=='php') {
$this->success('正在跳转到PHP中文网','http://www.php.cn');
}
}
}
这样当你访问的url
为:http://tp5.com/index/index/demo/name/php
时,就会调用success()
方法自动跳转。
5、什么是单一模块?什么时候需要使用它?
如果我们的应用非常简单,不需要划分模块的话,我们就可以使用单一模块,也就是没有模块,模块即应用,应用即模块。
首先我们要到惯例配置文件中找到是否支持多模块:app_multi_module
这项配置,其值修改为false
,即不支持多模块。
那么现在我们就需要将index
模块下的内容复制到application
目录下,即整个controller
目录移动到application
目录下。
现在我们该怎么访问呢?首先,命名空间需要更改:namespace app\controller;
,访问的url
也就变成http://tp5.com/index/index
直接跳过模块,到index
控制器的index()
方法。
这就是单一模块的意思。单一模块下,可以通过多级控制器的方法实现网站的前后台规划。
本章是站在使用者角度来思考问题,控制器的分级管理使项目逻辑更加清晰,空操作与空控制器使控制器具备了容错机制,
trait
的引入,使控制器可从多个trait
类中继承方法集,横向扩展了控制器的功能。