加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

ThinkPHP控制器详解

发布时间:2020-12-13 02:46:36 所属栏目:PHP教程 来源:网络整理
导读:《:ThinkPHP控制器详解》要点: 本文介绍了:ThinkPHP控制器详解,希望对您有用。如果有疑问,可以联系我们。 PHP实例 在上一课程中,你可能会对ThinkPHP的路由会有一丝丝疑惑,不过没关系,学完本课程,很多事都会豁然开朗. PHP实例 控制器文件命名遵守IndexCo

《:ThinkPHP控制器详解》要点:
本文介绍了:ThinkPHP控制器详解,希望对您有用。如果有疑问,可以联系我们。

PHP实例在上一课程中,你可能会对ThinkPHP的路由会有一丝丝疑惑,不过没关系,学完本课程,很多事都会豁然开朗.

PHP实例控制器文件命名遵守IndexController.class.php的方式

PHP实例控制器的定义

PHP实例在开始之前,我们还是必要明确一下控制器的定义:

PHP实例
<?php
namespace HomeController;
use ThinkController;
class IndexController extends Controller {
  public function read($id){
    echo "read page with </br>" .$id;
  }
  public function top(){
    echo "top page </br>";
  }
}

PHP实例如所见,前面在路由篇提到的控制器便是这么定义的:

PHP实例使用相应的命名空间,默认是namespace HomeController
加载ThinkController
新建控制器继承于Controller(或子类)
采用驼峰命名法,注意首字母大写
控制器内的公共办法可以看作一个操作,比如上面的read()和top()办法就可以看作操作,我们在路由篇的时候都验证过了.

PHP实例http://localhost:8999/index.php/Home/Index/top
就是拜访到top()方法,会在页面上打印出top page,再次明确Home代表的是Home模块

PHP实例有时候可能会遇到有和系统的关键字冲突的办法,这时候就可以使用设置操作办法后缀来解决了,具体请看官方文档:
http://document.thinkphp.cn/manual_3_2.html#define_controller

PHP实例前置和后置操作

PHP实例前置和后置操作指的是在执行某个操作方法之前和之后会自动调用的方法,不过仅对拜访控制器有效,如在IndexController中为top()方法添加前置后置方法:

PHP实例
public function _before_top(){
    echo "before top page </br>";
  }
  public function top(){
    echo "top page </br>";
  }
  public function _after_top(){
    echo "after top page </br>";
  }

PHP实例拜访:http://localhost:8999/index.php/Home/Index/top

PHP实例就会看到打印出:

PHP实例
before top page
top page
after top page

PHP实例使用前置和后置操作要注意如下两点:

PHP实例如果当前的操作并没有定义操作办法,而是直接渲染模板文件,那么如果定义了前置和后置办法的话,依然会生效.真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的.

PHP实例需要注意的是,在有些办法里面使用了exit或者错误输出之类的话 有可能不会再执行后置办法了.例如,如果在当前操作里面调用了系统Action的error办法,那么将不会再执行后置操作,但是不影响success办法的后置办法执行

PHP实例可以用于表单的过滤和验证

PHP实例参数绑定

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

PHP实例
'URL_PARAMS_BIND'    => true

PHP实例
参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定.
参数绑定有两种方式:依照变量名绑定和依照变量顺序绑定,默认使用的是依照变量名绑定,比如看下面的例子:

PHP实例
 public function read($id){
    echo "read page with </br>".$id;
  }
 public function archive($year,$month){
    echo "$year </br>".$month;
  }

PHP实例对,这个便是上一篇路由所涉及的内容,在之前路由的路由设置处

PHP实例'blogs/:id'?????????????? => array('Index/read')
我们将:id直接映射给read()方法的参数$id,所以现在回头再看,其实路由规则就是给了你一个自定义URL的功能.如果去掉上面的路由设置,我们正确的拜访方式是:

PHP实例http://localhost:8999/Home/index/read/id/3

PHP实例上面的URl中id便是变量名,如果你写成:

PHP实例
 public function read($title){
    echo "read page with </br>".$title;
  }

PHP实例那么拜访地址就是:

PHP实例http://localhost:8999/index.php/Home/index/read/title/3

PHP实例对于多个参数绑定的情况,只要将相应的变量名和值传进来就可以了,不在乎顺序,好比下面两个会返回相同的结果:

PHP实例http://localhost:8999/index.php/Home/index/archive/year/2012/month/12

PHP实例http://localhost:8999/index.php/Home/index/archive/month/12/year/2012

PHP实例需要注意的是,不管那种情况之下,当你拜访

PHP实例http://localhost:8999/index.php/Home/index/read/
是会报错的:

PHP实例参数错误或者未定义:id
解决的一个好办法就是,给绑定的参数设置默认值,比如:

PHP实例
 public function read($id=0){
    echo "read page with </br>".$id;
  }

PHP实例这样再次拜访上面的URL,就会输出:

PHP实例read page with
0

PHP实例tips:给绑定参数设置默认值是一个避免报错的好方法
在实际的开发中,我们其实会见到没有显示变量名这样的URL,如:

PHP实例http://localhost:8999/index.php/Home/index/read/3

PHP实例怎么解决呢?这个时候,我们其实就可以用到第二种参数绑定:依照变量顺序绑定.要使用这种参数绑定,需要先在设置项中设置:

PHP实例
'URL_PARAMS_BIND_TYPE' => 1

PHP实例一旦设置变量顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整.这种情况下操作方法的定义不需要改变,只是访问的URL变了罢了,现在用上面的方式访问就可以正确访问了.

PHP实例如果在变量顺序绑定的情况下,我们拜访:

PHP实例http://localhost:8999/index.php/Home/index/archive/2012/12

PHP实例http://localhost:8999/index.php/Home/index/archive/12/2012

PHP实例这两个结果显然是不一样,后者并不是我们想要的.所以这种情况必要严格遵守顺序来传值.

PHP实例伪静态

PHP实例URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行,默认情况下,伪静态的设置为html.但我们可以本身设置,例如

PHP实例'URL_HTML_SUFFIX'=>'shtml'

PHP实例如果希望支持多个伪静态后缀,可以直接设置如下:

PHP实例'URL_HTML_SUFFIX' => 'html|shtml|xml'

PHP实例如果此项设置留空则表示可以支持所有的静态后缀.

PHP实例也可以设置禁止拜访的URL后缀通过URL_DENY_SUFFIX来设置,例如:

PHP实例'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg',
注: URL_DENY_SUFFIX的优先级比URL_HTML_SUFFIX要高.

PHP实例URL生成

PHP实例为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U办法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响.

PHP实例定义规则

PHP实例U办法的定义规则如下(方括号内参数根据实际应用决定):
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])

PHP实例地址表达式

PHP实例地址表达式的格式定义如下:

PHP实例[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
如果不定义模块的话 就表示当前模块名称,下面是一些简单的例子:

PHP实例U('User/add') // 生成User控制器的add操作的URL地址
U('Article/read?id=1') // 生成Article控制器的read操作 并且id为1的URL地址
U('Admin/User/select') // 生成Admin模块的User控制器的select操作的URL地址

PHP实例参数

PHP实例U办法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:

PHP实例
U('Article/cate',array('cate_id'=>1,'status'=>1))
U('Article/cate','cate_id=1&status=1')
U('Article/cate?cate_id=1&status=1')

PHP实例三种方式是等效的,都是生成Article控制器的cate()操作 并且cate_id为1 status为1的URL地址

PHP实例但是不允许使用下面的定义方式来传参数:

PHP实例
U('Article/cate/cate_id/1/status/1');

PHP实例生成路由地址

PHP实例U办法还可以支持路由,如果我们定义了一个路由规则为:

PHP实例
'blogs/:idd'=>'Index/read'

PHP实例那么可以使用

PHP实例
U('/blogs/1');

PHP实例最毕生成的URL地址是:

PHP实例http://localhost:8999/index.php/Home/blogs/1

PHP实例跳转和重定向

PHP实例这应该是在开发中最常用的功能之一.在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面.系统的ThinkController类内置了两个跳转办法success()和error(),用于页面跳转提示.

PHP实例跳转

PHP实例使用办法很简单,比如我们在Index控制器下新建一个办法user(),写上下面的内容:

PHP实例
public function user()
  {
    $User = M('User');
    $data['username'] = 'Think';
    $data['email'] = 'Think@gmail.com';
    $result = $User->add($data);
    if($result){
      $this->success('success','/Home/User/addUser');
    } else {
      $this->error('failed');
    }
  }

PHP实例M('User')表示实例化一个User对象,add()办法是向数据库添加一条纪录.然后我们需要新建一个UserController,在里面写上addUser()办法

PHP实例
<?php
namespace HomeController;
use ThinkController;
class UserController extends Controller {
  public function addUser()
  {
    echo 'add user done!';
  }
}

PHP实例然后在浏览器中拜访http://localhost:8999/Home/Index/user,就可以看到add user done!了,下面详细来说说这两个重定向方法.

PHP实例success()和error()办法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:

PHP实例
// redirect to /Article/index after 3 seconds when success
$this->success('done','/Home/Article/index',3);
// redirect to /Article/error after 5 seconds when failed
$this->error('failed','/Home/Article/error',5);

PHP实例如果不设置跳转时间,默认的等待时间success()办法是1秒,error()办法是3秒.看到上面的两个跳转地址前面都带上了/Home,如果你想简写为/Article/index,你需要在ThinkPHP的入口文件(项目目录下的index.php)中加上下面一行:

PHP实例
define('BIND_MODULE','Home');

PHP实例而且这两个办法都有对应的模板,默认的设置是两个办法对应的模板都是:

PHP实例'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',

PHP实例'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
你可以根据本身的需要来修改模版.

PHP实例重定向

PHP实例Controller类的redirect()办法可以实现页面的重定向功能.
redirect()办法的参数用法和U函数的用法一致(参考上一部分URL生成部分),例如:

PHP实例$this->redirect('/Home/Article/show',array('id' => 2),3,'Redirecting...');
上面的用法是停留3秒后跳转到Article控制器的show()操作,并且显示页面跳转中字样Redirecting...,重定向后会改变当前的URL地址.

PHP实例为了成功进行测试,我们在IndexController下添加redirectToArticle()办法并写上上面那行代码:

PHP实例
public function redirectToArticle()
  {
    $this->redirect('/Home/Article/show','Redirecting...');
  }

PHP实例然后我们创建一个ArticleController,并且为他添加show()办法:

PHP实例
namespace HomeController;
use ThinkController;
class ArticleController extends Controller {
  public function show($id)
  {
    echo 'This is an Article Page';
    // $id 变量我们后续会用到,现在只是演示跳转
  }
}

PHP实例然后在浏览器拜访:http://localhost:8999/Home/Index/redirectToArticle,等待三秒,你就可以看到跳转之后的页面了.

PHP实例如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作办法,可以直接使用redirect()函数重定向,例如

PHP实例$this->redirect('/Home/Article/show/id/3','Redirecting...',3);

PHP实例注:控制器的redirect()办法和redirect()函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址
注:好像官方文档是这样写的

PHP实例$this->redirect('/New/category/cate_id/2',5,'页面跳转中...');

PHP实例以上所述便是本文的全部内容了,希望大家能够喜欢.

《:ThinkPHP控制器详解》是否对您有启发,欢迎查看更多与《:ThinkPHP控制器详解》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读