• 控制器[1]


    一. 控制器操作

    我们首先复习一下基本的控制器定义和方法执行方式。
    第一步:控制器默认创建在当前模块下的 Controller 目录下;
    第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php;
    第三步:控制器里的方法必须是 public 公共的;

    1 //控制器
    2 class UserController s extends Controller {
    3 public n function index() {
    4 //index()方法在URL访问时可以忽略
    5   }
    6 }
     URL 访问: http://localhost/demo39/User/index/ 

    有时方法名可能和关键字冲突,那么定义起来就比较麻烦

    在 WeiBo/home/controller/IndexController.class.php 中如果方法名与ThinkPHP中的关键字重合,则会出错,类似:

    1 <?php
    2 namespace HomeController;
    3 use ThinkController;
    4 class IndexController extends Controller {
    5     public function class() {
    6         echo "this is class";
    7     }
    8 }

    报错如下:

    控制器提供了一个配置定义:

    在 WeiBo/Conf/config.php 中进行配置:

    1 //配置控制器方法后缀
    2 'ACTION_SUFFIX'=>'Action',

    每个方法后面加上Action,对于URL访问不需要加Action

    1 class IndexController  extends Controller {
    2  public  function indexAction() {
    3   echo 'index';
    4 }
    5  public function classAction() {
    6  echo 'test';
    7   }
    8 }

    这是在浏览器中输入 http://localhost/demo39/index/class 则可以访问,

    注意,这是浏览器中的地址还是class,而不是classAction

    默认情况下通过 URL 访问的页面是控制器模块下的方法,即:Controller 目录下的
    UserController.class.php 类。它是对外公开可访问的,我们可以称为访问控制器。那
    么很多时候,由于项目业务的高度繁杂,我们可能想法很多业务分离到另外的层,比如事件
    控制器层。那么可以这么操作:

    第一步:创建事件控制器目录:Event;(此时Event与Controller同级)
    第二步:创建 UserEvent.class.php 类;

    代码如下:

    1 <?php
    2 namespace HomeEvent;
    3 
    4 class UserEvent {
    5     public function test() {
    6         echo '这是事件控制器层的封装,不对外公开,属于内部调用!';
    7     }
    8 }

    在 WeiBo/home/controller/IndexController.class.php 中调用是如下:

    <?php
    
    namespace HomeController;
    use ThinkController;
    use HomeEventUserEvent;
    
    class indexController extends Controller {
    
        public   function event() {
           $userEvent =  new UserEvent();
           $userEvent->test();
             echo 'test';
       }
    }

    这时即可调用成功:

    PS:这里调用别的控制器还可以使用快捷调用方法 A()。

    1 $userEvent = A('User', 'Event');
    2 $userEvent = A('Admin/User', 'Event'); //在Admin下的user调用Event

    代码如下:

     1 <?php
     2 
     3 namespace HomeController;
     4 use ThinkController;
     5 use HomeEventUserEvent;
     6 
     7 class IndexController extends Controller {
     8     public function event() {
     9         //$userEvent = new UserEvent();
    10         $userEvent = A('User','Event');
    11         $userEvent->test();
    12         echo "test";
    13     }
    14 }

    默认情况下,控制器只支持一级控制器。当项目较为繁杂的时候,想创建统一模块下多
    个控制器时,可以配置二级控制器。

    第一步:配置允许二级控制器

    在 WeiBo/Common/Conf/config.php 中写入如下配置代码:

    1 //允许二级控制器
    2 'CONTROLLER_LEVEL'=>2,

    在 WeiBo/Home/Controller/ 下新建  Member  文件夹,然后在 Member 文件夹下新建 CommentController.class.php 文件,代码如下:

    1 <?php
    2 namespace HomeControllerMember;
    3 use ThinkController;
    4 
    5 class CommentController extends Controller {
    6     public function test() {
    7         echo 'comment test';
    8     }
    9 }

    此时在浏览次地址出输入 http://localhost/demo39/Member/Comment/test 即可得到:

    但是此时如果加载与 Member 文件同级的 IndexController.class.php ,则会发生错误,

    但如果在config文件中把

    1 //允许二级控制器
    2 'CONTROLLER_LEVEL'=>2,

    去掉,则又可以重新访问了。

    ThinkPHP 控制器还提供了两个特殊的方法,前置操作方法_before_index()和后置操
    作方法_after_index()。这两个方法,在控制器调用 index()方法的时候,一个在之前执

    行,一个在之后执行。

    在 WeiBo/Home/Controller/IndexController.class.php 中的代码如下:

     1 <?php
     2 
     3 namespace HomeController;
     4 use ThinkController;
     5 use HomeEventUserEvent;
     6 
     7 class IndexController extends Controller {
     8     public function index() {        
     9         echo "this is index"."<br>";
    10     }
    11 
    12     public function _before_index() {
    13         echo "this is before index"."<br>";
    14     }
    15     public function _after_index() {
    16         echo "this is after index"."<br>";
    17     }
    18 }

    效果图如下:

    二.Action  参数绑定

    参数绑定是通过直接绑定 URL 地址中的变量作为操作方法的参数,可以简化方法的定
    义甚至路由的解析。

    在 WeiBo/Common/Conf/config.php 中配置如下:

    1 //启用Action参数绑定,默认为true,可以不写
    2 'URL_PARAMS_BIND'=> true,

    默认的参数绑定是按变量名来绑定的,直接通过 URL 传递参数。

    1 //变量名为$id
    2  class IndexController  extends Controller {
    3  public  function index($id) {
    4  echo 'id:'.$id;
    5      }
    6 }

    通过URL  http://localhost/demo39/Index/index/id/5 访问,得到:

    PS:当你 URL 没有传递参数(id/5)的时候,那么页面会报错:参数错误或者未定义:id。
    当然,如果取消绑定,则不会报错'URL_PARAMS_BIND'=> false,。但是,为了程序的
    严谨性,一般需要不要取消参数绑定。

    如果你个那个参数设定一个默认值,当没有传递参数的时候,会直接启用默认值:

    1 //给变量$id 设置默认值
    2  public  function index($id=1)

    还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说 id 不需要
    传递,只需要传递 5 这个值即可。但必须按照多个参数的顺序。

    在config.php中的配置如下:

    1 //定义按顺序传参绑定
    2 'URL_PARAMS_BIND_TYPE'=>1,

    在 WeiBo/Home/Controller/IndexController.class.php 中的代码如下:

    //传递两个参数
     class IndexController  extends Controller {
     public  function index($id, $type) {
     echo 'id:'.$id.',type:'.$type;
      }
    }

    此时URL  http://localhost/demo39/User/index/5/a 

    得到结果如下:

  • 相关阅读:
    Android 压力测试工具Monkey
    解决maven的依赖总是无法下载完成
    JDBC连接数据库(二)
    JDBC连接数据库(一)
    webdriver js点击无法点击的元素
    多线程Java面试题总结
    PHP unset销毁变量并释放内存
    ThinkPHP函数详解:D方法
    PHP 函数:intval()
    ThinkPHP 模板显示display和assign的用法
  • 原文地址:https://www.cnblogs.com/jacson/p/4575260.html
Copyright © 2020-2023  润新知