美文网首页
29、TP5控制器进阶知识

29、TP5控制器进阶知识

作者: IUVO | 来源:发表于2018-06-02 23:06 被阅读83次
    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类中继承方法集,横向扩展了控制器的功能。

    相关文章

      网友评论

          本文标题:29、TP5控制器进阶知识

          本文链接:https://www.haomeiwen.com/subject/hfkdsftx.html