thinkphp 控制器定义

控制器和操作

一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法

下面就是一个典型的控制器类的定义:

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo ‘hello,thinkphp!‘;
  7. }
  8. }

Home\IndexController类就代表了Home模块下的Index控制器,而hello操作就是Home\IndexController类的hello(公共)方法。

当访问 http://serverName/index.php/Home/Index/hello 后会输出:

  1. hello,thinkphp!

注意:如果你设置了操作方法绑定到类,则操作方法对应了一个类(参考操作绑定到类)。

定义控制器

控制器通常需要继承系统的Controller类或者其子类,例如,下面定义了一个 \Home\Controller\IndexController 控制器类:

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo ‘hello‘;
  7. }
  8. public function test(){
  9. echo ‘test‘;
  10. }
  11. }

控制器的名称采用驼峰法命名(首字母大写),控制器文件位于 Home/Controller/IndexController.class.php

IndexController控制器类的hello和test方法就是操作方法,访问下面的URL地址:

  1. http://serverName/Home/Index/hello
  2. http://serverName/Home/Index/test

会分别输出:

  1. hello
  2. // 和
  3. test

操作方法的定义必须是公共方法,否则会报操作错误,所以,下面的操作定义只能访问hello操作,而不能访问test操作。

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo ‘hello‘;
  7. }
  8. protected function test(){
  9. echo ‘test‘;
  10. }
  11. }

因为操作方法就是控制器的一个方法,所以遇到有和系统的关键字冲突的方法可能就不能定义了,这个时候我们可以设置操作方法的后缀来解决,例如:

  1. ‘ACTION_SUFFIX‘ => ‘Action‘, // 操作方法后缀

设置操作方法的后缀为Action,这样,控制器的操作方法定义调整为:

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function listAction(){
  6. echo ‘list‘;
  7. }
  8. public function helloAction(){
  9. echo ‘hello‘;
  10. }
  11. public function testAction(){
  12. echo ‘test‘;
  13. }
  14. }

操作方法的后缀设置只是影响控制器类的定义,对URL访问没有影响。

多层控制器

ThinkPHP的控制器支持多层和多级,多层指的是控制器可以分层,例如除了默认的Controller控制器层(我们可以称之为访问控制器),还可以添加事件控制器(层),例如:

  1. ├─Controller 访问控制器
  2. │ ├─UserController.class.php
  3. │ ├─BlogController.class.php
  4. │ ...
  5. ├─Event 事件控制器
  6. │ ├─UserEvent.class.php
  7. │ ├─BlogEvent.class.php
  8. │ ...

访问控制器的名称是通过DEFAULT_C_LAYER设置的,默认是Controller。

访问控制器负责外部交互响应,通过URL请求响应,例如 http://serverName/Home/User/index,而事件控制器负责内部的事件响应,并且只能在内部调用,所以是和外部隔离的。

多层控制器的划分可以根据项目的需要自由分层。

如果是定义其他的控制器层,则不一定必须要继承系统的Controller类或其子类,通常需要输出模版的时候才需要继承Controller类。例如:

  1. <?php
  2. namespace Home\Event;
  3. class UserEvent {
  4. public function login(){
  5. echo ‘login event‘;
  6. }
  7. public function logout(){
  8. echo ‘logout event‘;
  9. }
  10. }

UserEvent事件控制器位于 Home/Event/UserEvent.class.php 。

多级控制器

多级控制器是指控制器可以通过子目录把某个控制器层分组存放,首先需要设置控制器的分级层次,例如,我们设置2级目录的控制器层:

  1. ‘CONTROLLER_LEVEL‘ => 2,

控制器文件的位置放置如下:

  1. ├─Controller 访问控制器
  2. │ ├─User User分级(组)
  3. │ │ ├─UserTypeController.class.php
  4. │ │ ├─UserAuthController.class.php
  5. │ ...
  6. │ ├─Admin Admin分级(组)
  7. │ │ ├─UserController.class.php
  8. │ │ ├─ConfigController.class.php
  9. │ ...

多级控制器中的命名空间需要这样定义:

  1. <?php
  2. namespace Home\Controller\Admin;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo ‘hello‘;
  7. }
  8. public function test(){
  9. echo ‘test‘;
  10. }
  11. }

然后就可以通过URL地址访问:

  1. http://serverName/Home/User/UserType
  2. http://serverName/Home/Admin/User

如果希望简化URL地址中的模块地址,可以参考 模块部署

实例化控制器

访问控制器的实例化通常是自动完成的,系统会根据URL地址解析出访问的控制器名称自动实例化,并且调用相关的操作方法。

如果你需要跨控制器调用的话,则可以单独实例化:

  1. // 实例化Home模块的User控制器
  2. $User = new \Home\Controller\UserController();
  3. // 实例化Admin模块的Blog控制器
  4. $Blog = new \Admin\Controller\BlogController();

大理石平台规格

系统为上面的控制器实例化提供了一个快捷调用方法A,上面的代码可以简化为:

  1. // 假设当前模块是Home模块
  2. $User = A(‘User‘);
  3. $Blog = A(‘Admin/Blog‘);

默认情况下,A方法实例化的是默认控制器层(Controller),如果你要实例化其他的分层控制器的话,可以使用:

  1. // 假设当前模块是Home模块
  2. // 实例化Event控制器
  3. $User = A(‘User‘,‘Event‘);
  4. $Blog = A(‘Admin/Blog‘,‘Event‘);

上面的代码等效于:

  1. // 实例化Home模块的User事件控制器
  2. $User = new \Home\Event\UserEvent();
  3. // 实例化Admin模块的Blog事件控制器
  4. $Blog = new \Admin\Event\BlogEvent();

原文地址:https://www.cnblogs.com/furuihua/p/11777428.html

时间: 2024-11-08 21:54:13

thinkphp 控制器定义的相关文章

ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程

ThinkPHP2.2框架执行原理.流程图在线手册 ThinkPHP控制器的执行流程 对用户的第一次URL访问 http://<serverIp>/My/index.php/Index/show/ 所执行的流程进行详细的分析,用户的URL访问首先是定位到了My项目的index.php 入口文件(注意:如果使用了URL_REWRITE,可能index.php已经被隐藏了),项目的入口文件所做的其实是实例化一个App应用实例,并且执行这个应用. 1.加载公共入口文件 在实例化App类之前,我们需要

Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作.方法). 1.1.实现接口Controller定义控制器 Controller是一个接口,处在包org.springframework.web.servlet.mvc下,接口中只有一个未实现的方法,具体的接口如下所示: package org.springframework.web.servlet.

Thinkphp学习——控制器_控制器定义

一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法. 下面就是一个典型的控制器类的定义: <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello,thinkphp!'; } } Home\IndexController类就代表了Home模块下的Index控制器

ThinkPHP控制器相关操作

1.空操作 空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化. http://网址/index.php/Home/Main/login http://网址/index.php/Home/Main/hello  空操作 出现页面: 显示的错误信息过于详细,为安全以及优化页面起见,实行空操作 1.做一个_empty()方法.要在子类里面写,不要再父类里(推荐使用) function _empty() { ech

ThinkPHP 控制器调用模板的流程和项目模板部署步骤

现在主流的MVC框架网站中,控制器接收到页面请求后,通常会调用相应的模板,模板经过渲染之后,内容返回给前台页面,如下面ThinkPHP的一个控制器: shop/home/controller/UserController.class.php <?php   namespace Home\Controller; use Think\Controller; class UserController extends Controller {     //登陆事件,function默认public,所以

Thinkphp 控制器

控 制 器: 1.命名方法:新建一个主页面的控制器 controller文件夹下新建一个文件,命名为:MainController.class.php首字母都大写,称为驼峰命名法 eg: <?php namespace Home\Controller; use Think\Controller; class MainController extends Controller { public function XianShi() { echo "主页面显示"; } } 2. C(

ThinkPHP控制器

控制器 控制器是MVC模式中的核心,tp默认有一个Index控制器: 1.控制器的命名规则:新建一个主页面的控制器 在JiaoWu/Home/Controller下新建一个文件:MainController.php书写方式是驼峰法,即首字母大写Main是控制器的名称,并做一个XianShi的方法 里面的内容书写方式仿照之前的IndexController.php <?php namespace Home\Controller; use Think\Controller; class MainCo

Ajax传递二维数组至后台ThinkPHP控制器

最近为单位做了专家库的小程序,没个专家有擅长的领域,这是通过一个checkbox来提交和编辑的.因为不想刷新页面,使用Ajax异步传输. 首先从专业数据表中读取所有的专业,并且生成checkbox: $(document).ready(function(){ $.ajax({ type:"POST", url:"http://localhost/yibu/index.php/Home/Expertadd/expertecho",//对应控制器读取专业列表 succe

ThinkPHP模型定义

模型类一般位于项目的Lib/Model 目录下面,当我们创建一个UserModel类的时候,其实已经遵循了系统的约定.模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义Model,例如: 模型名(类名) 约定对应数据表(假设数据库的前缀定义是 think_) UserModel think_user UserTypeModel think_user_type 如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性. 在Thin