29、TP5控制器进阶知识

2018-06-02  本文已影响83人  IUVO
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.phpsuccess()方法;
可以使用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类中继承方法集,横向扩展了控制器的功能。

上一篇下一篇

猜你喜欢

热点阅读