thinkphp 公共控制器怎样获取控制器名称和操作名称

Thinkphp 空操作、空控制器、命名空间(详解)
转载 &更新时间:日 11:54:16 & 投稿:jingxian
下面小编就为大家带来一篇Thinkphp 空操作、空控制器、命名空间(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
http://网址/index.php/Home/Main/login
http://网址/index.php/Home/Main/hello 空操作
出现页面:
显示的错误信息过于详细,为安全以及优化页面起见,实行空操作
1、做一个_empty()方法。要在子类里面写,不要再父类里(推荐使用)
function _empty()
  echo "网页不存在,请检查浏览器地址信息!";
2.造一个该方法对应的模版
在view/main下面新建一个text.html文件
&h1&别乱访问&/h1&
注意:空操作方法仅在你的控制器类继承系统的Think\Controller类才有效,否则需要自己定义 __call 来实现。
2、空控制器
空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化。
Home/Controller/EmptyController.class.php
namespace Home\C
use Think\C
class EmptyController extends Controller
public function _empty()
echo "访问的页面不存在!";
3、跨控制器调用
一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。
跨控制器调用可以节省我们代码的工作量
3.1 同一模块下:
例如:在Home/Controller中有两个控制器:IndexController.class.php和MainController.class.php
在IndexController.class.php有一个方法:
public function ShuChu()
return "教务管理系统!";
现在想要在 MainController.class.php中也调用ShuChu()方法
function DiaoYong()
//方法一:造对象
//$index=new IndexController();
//echo $index-&ShuChu();
//造对象有快捷函数供我们使用:
//A(“[模块/]控制器标志”) 实例化控制器对象
//方法二:使用A()方法
//$index=A("Index");
//echo $index-&ShuChu();
//R([模块/]控制器标志/操作方法) 实例化对象同时调用指定方法
//方法三:使用R()方法,造对象并且调用某个特定的方法
echo R("Index/ShuChu");
运行结果:
3.2 不同模块下:
新添加一个模块Admin
TextController.class.php:
namespace Admin\C
use Think\C
class TextController extends Controller
public function Text()
echo "HHHHH";
现在想要在Home/Controller/ MainController.class.php中也调用Text()方法
function Text()
//跨模块调用
//方法一:使用A()方法
//$tt=A("Admin/Text");
//echo $tt-&Text();
//方法二:使用R()方法,造对象并且调用某个特定的方法
echo R("Admin/Text/Text");
运行结果:
4.命名空间namespace
相当于一个虚拟的目录
正常管理文件使用文件夹--物理区分
TP框架的初始命名空间是:ThinkPHP\Library
在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\Library)
1.系统目录下根命名空间是ThinkPHP\Library下面的文件夹名称命名的
2.模块的根命名空间是以模块名命名的
在定义命名空间的时候需要从根写起例如:Home\Controller 例如:Think\Model
如果要使用某个类文件,引入该类命名空间的时候:
使用use关键字,后面写该类的命名空间 后面加上 "\文件名"
如果不想引入命名空间:在造类的对象的时候可以使用\(初始命名空间)来找到对应的类
例如:new \Think\Page(30);
以上这篇Thinkphp 空操作、空控制器、命名空间(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具thinkphp控制器变量在模板中显示
控制器中变量
public function register() {
$type = I("param.type");//1.学生注册 2.教师注册
3.其他注册
$this -& assign("type", $type);
//q全部部门
$depart1 = M("Depart") -& where("status=1 and fid=0") -& order("id asc") -& select();
$this -& assign("depart1", $depart1);
$this -& display();
模板中引用位置一:php代码中,直接用$i;
echo $i;&/php模板中引用位置二:模板中直接应用{$i}或者 class="{$unlogined}"&font color="red"&注意:1.非相关人员,严禁注册。{$i}&/font&&br&
$logined = is_array($_SESSION['userInfo']) ? "" : "hide-div";
$unlogined = $logined == "hide-div" ? "" : "hide-div";
&div id="unlogined-div" class="{$unlogined}"&模板中引用位置三:模板标签中用,如condition中用,不加{}。&if condition="$type neq 4"&
&div class="form-group"&
&label for="" class="control-label col-sm-3"&一级部门: &span class="text-danger"&*&/span&&/label&
&div class="col-sm-9"&
&select name="depart1_id" id="depart1_id"
onchange="depart1change()" class="form-control input-sm"&
&option value="-1"&-----请选择一级部门-----&/option&
&foreach name="depart1" item="vo"&
&option value="{$vo.id}"&{$vo.name}&/option&
&/foreach&
&div class="form-group"&
&label for="" class="control-label col-sm-3"&二级部门: &span class="text-danger"&*&/span&&/label&
&div class="col-sm-9"&
&select name="depart2_id" id="depart2_id" onchange="depart2change()" class="form-control input-sm"&
&option selected='selected'&-----请先选择一级部门-----&/option&
&div class="form-group"&
&label for="" class="control-label col-sm-3"&三级部门: &span class="text-danger"&*&/span&&/label&
&div class="col-sm-9"&
&select name="depart3_id" id="depart3_id" class="form-control input-sm"&
&option selected='selected'&-----请先选择二级部门-----&/option&
没有更多推荐了,竭尽全力。
thinkphp怎样获取控制器名称和操作名称(不是在模板里面获取)
: 网站根目录地址
: 当前项目(入口文件)地址
__GROUP__ :当前分组地址
: 当前模块地址
__ACTION__ : 当前操作地址
: 当前 URL 地址
ACTION_NAME : 当前操作名称
APP_PATH : 当前项目目录
APP_NAME : 当前项目名称
没有更多推荐了,ThinkPHP控制器详解
转载 &更新时间:日 11:23:10 & 投稿:hebedich
一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法。下面我们就来详细谈谈ThinkPHP的控制器
在上一课程中,你可能会对ThinkPHP的路由会有一丝丝疑惑,不过没关系,学完本课程,很多事都会豁然开朗。
控制器文件命名遵守IndexController.class.php的方式
控制器的定义
在开始之前,我们还是需要明确一下控制器的定义:
namespace Home\C
use Think\C
class IndexController extends Controller {
public function read($id){
echo "read page with &/br&" .$
public function top(){
echo "top page &/br&";
如所见,前面在路由篇提到的控制器就是这么定义的:
使用相应的命名空间,默认是namespace Home\Controller
加载Think\Controller
新建控制器继承于Controller(或子类)
采用驼峰命名法,注意首字母大写
控制器内的公共方法可以看作一个操作,比如上面的read()和top()方法就可以看作操作,我们在路由篇的时候都验证过了。
就是访问到top()方法,会在页面上打印出top page ,再次明确Home代表的是Home模块
有时候可能会遇到有和系统的关键字冲突的方法,这时候就可以使用设置操作方法后缀来解决了,具体请看官方文档:
前置和后置操作
前置和后置操作指的是在执行某个操作方法之前和之后会自动调用的方法,不过仅对访问控制器有效,如在IndexController中为top()方法添加前置后置方法:
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&";
就会看到打印出:
before top page
after top page
使用前置和后置操作要注意如下两点:
如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。
需要注意的是,在有些方法里面使用了exit或者错误输出之类的话 有可能不会再执行后置方法了。例如,如果在当前操作里面调用了系统Action的error方法,那么将不会再执行后置操作,但是不影响success方法的后置方法执行
可以用于表单的过滤和验证
参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。
'URL_PARAMS_BIND'
参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定。
参数绑定有两种方式:按照变量名绑定和按照变量顺序绑定,默认使用的是按照变量名绑定,比如看下面的例子:
public function read($id){
echo "read page with &/br&".$
public function archive($year, $month){
echo "$year &/br&".$
对,这个就是上一篇路由所涉及的内容,在之前路由的路由设置处
'blogs/:id'&&&&&&&&&&&&&& =& array('Index/read')
我们将:id直接映射给read()方法的参数$id,所以现在回头再看,其实路由规则就是给了你一个自定义URL的功能。如果去掉上面的路由设置,我们正确的访问方式是:
上面的URl中id就是变量名,如果你写成:
public function read($title){
echo "read page with &/br&".$
那么访问地址就是:
对于多个参数绑定的情况,只要将相应的变量名和值传进来就可以了,不在乎顺序,比如下面两个会返回相同的结果:
需要注意的是,不管那种情况之下,当你访问
是会报错的:
参数错误或者未定义:id
解决的一个好方法就是,给绑定的参数设置默认值,比如:
public function read($id=0){
echo "read page with &/br&".$
这样再次访问上面的URL,就会输出:
read page with
tips:给绑定参数设置默认值是一个避免报错的好办法
在实际的开发中,我们其实会见到没有显示变量名这样的URL,如:
怎么解决呢?这个时候,我们其实就可以用到第二种参数绑定:按照变量顺序绑定。要使用这种参数绑定,需要先在设置项中设置:
'URL_PARAMS_BIND_TYPE' =& 1
一旦设置变量顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整。这种情况下操作方法的定义不需要改变,只是访问的URL变了而已,现在用上面的方式访问就可以正确访问了。
如果在变量顺序绑定的情况下,我们访问:
这两个结果显然是不一样,后者并不是我们想要的。所以这种情况需要严格遵守顺序来传值。
URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行,默认情况下,伪静态的设置为html。但我们可以自己设置,例如
'URL_HTML_SUFFIX'=&'shtml'
如果希望支持多个伪静态后缀,可以直接设置如下:
'URL_HTML_SUFFIX' =& 'html|shtml|xml'
如果此项设置留空则表示可以支持所有的静态后缀。
也可以设置禁止访问的URL后缀通过URL_DENY_SUFFIX来设置,例如:
'URL_DENY_SUFFIX' =& 'pdf|ico|png|gif|jpg',
注: URL_DENY_SUFFIX的优先级比URL_HTML_SUFFIX要高。
为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。
U方法的定义规则如下(方括号内参数根据实际应用决定):
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
地址表达式
地址表达式的格式定义如下:
[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
如果不定义模块的话 就表示当前模块名称,下面是一些简单的例子:
U('User/add') // 生成User控制器的add操作的URL地址
U('Article/read?id=1') // 生成Article控制器的read操作 并且id为1的URL地址
U('Admin/User/select') // 生成Admin模块的User控制器的select操作的URL地址
U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:
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')
三种方式是等效的,都是生成Article控制器的cate()操作 并且cate_id为1 status为1的URL地址
但是不允许使用下面的定义方式来传参数:
U('Article/cate/cate_id/1/status/1');
生成路由地址
U方法还可以支持路由,如果我们定义了一个路由规则为:
'blogs/:id\d'=&'Index/read'
那么可以使用
U('/blogs/1');
最终生成的URL地址是:
跳转和重定向
这应该是在开发中最常用的功能之一。在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\Think\Controller类内置了两个跳转方法success()和error(),用于页面跳转提示。
使用方法很简单,比如我们在Index控制器下新建一个方法user(),写上下面的内容:
public function user()
$User = M('User');
$data['username'] = 'Think';
$data['email'] = '';
$result = $User-&add($data);
if($result){
$this-&success('success', '/Home/User/addUser');
$this-&error('failed');
M('User')表示实例化一个User对象,add()方法是向数据库添加一条纪录。然后我们需要新建一个UserController,在里面写上addUser()方法
namespace Home\C
use Think\C
class UserController extends Controller {
public function addUser()
echo 'add user done!';
然后在浏览器中访问,就可以看到add user done!了,下面详细来说说这两个重定向方法。
success()和error()方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:
// 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);
如果不设置跳转时间,默认的等待时间success()方法是1秒,error()方法是3秒。看到上面的两个跳转地址前面都带上了/Home,如果你想简写为/Article/index,你需要在ThinkPHP的入口文件(项目目录下的index.php)中加上下面一行:
define('BIND_MODULE','Home');
而且这两个方法都有对应的模板,默认的设置是两个方法对应的模板都是:
'TMPL_ACTION_ERROR' =& THINK_PATH . 'Tpl/dispatch_jump.tpl',
'TMPL_ACTION_SUCCESS' =& THINK_PATH . 'Tpl/dispatch_jump.tpl',
你可以根据自己的需要来修改模版。
Controller类的redirect()方法可以实现页面的重定向功能。
redirect()方法的参数用法和U函数的用法一致(参考上一部分URL生成部分),例如:
$this-&redirect('/Home/Article/show', array('id' =& 2), 3, 'Redirecting...');
上面的用法是停留3秒后跳转到Article控制器的show()操作,并且显示页面跳转中字样Redirecting...,重定向后会改变当前的URL地址。
为了成功进行测试,我们在IndexController下添加redirectToArticle()方法并写上上面那行代码:
public function redirectToArticle()
$this-&redirect('/Home/Article/show', array('id' =& 2), 3, 'Redirecting...');
然后我们创建一个ArticleController,并且为他添加show()方法:
namespace Home\C
use Think\C
class ArticleController extends Controller {
public function show($id)
echo 'This is an Article Page';
// $id 变量我们后续会用到,现在只是演示跳转
然后在浏览器访问:,等待三秒,你就可以看到跳转之后的页面了。
如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect()函数重定向,例如
$this-&redirect('/Home/Article/show/id/3', 'Redirecting...',3);
注:控制器的redirect()方法和redirect()函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址
注:好像官方文档是这样写的
$this-&redirect('/New/category/cate_id/2', 5, '页面跳转中...');
以上所述就是本文的全部内容了,希望大家能够喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
http://网址/index.php/Home/Main/login
http://网址/index.php/Home/Main/hello& 空操作
出现页面:
显示的错误信息过于详细,为安全以及优化页面起见,实行空操作
1、做一个_empty()方法。要在子类里面写,不要再父类里(推荐使用)
function _empty()
  echo "网页不存在,请检查浏览器地址信息!";
2.造一个该方法对应的模版在view/main下面新建一个text.html文件
&h1&别乱访问&/h1&
注意:空操作方法仅在你的控制器类继承系统的Think\Controller类才有效,否则需要自己定义 __call 来实现。
2.空控制器
空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化。
Home/Controller/EmptyController.class.php
namespace Home\C
use Think\C
class EmptyController extends Controller
public function _empty()
echo "访问的页面不存在!";
3、跨控制器调用
一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。
跨控制器调用可以节省我们代码的工作量
3.1 同一模块下:
例如:在Home/Controller中有两个控制器:IndexController.class.php和MainController.class.php
在IndexController.class.php有一个方法:
public function ShuChu()
return "教务管理系统!";
现在想要在&MainController.class.php中也调用ShuChu()方法
function DiaoYong()
//方法一:造对象
//$index=new IndexController();
//echo $index-&ShuChu();
//造对象有快捷函数供我们使用:
//A(&[模块/]控制器标志&) 实例化控制器对象
//方法二:使用A()方法
//$index=A("Index");
//echo $index-&ShuChu();
//R([模块/]控制器标志/操作方法)
实例化对象同时调用指定方法
//方法三:使用R()方法,造对象并且调用某个特定的方法
echo R("Index/ShuChu");  }
运行结果:
3.2 不同模块下:
新添加一个模块Admin
TextController.class.php:
namespace Admin\C
use Think\C
class TextController extends Controller
public function Text()
echo "HHHHH";
现在想要在Home/Controller/ MainController.class.php中也调用Text()方法
function Text()
//跨模块调用
//方法一:使用A()方法
//$tt=A("Admin/Text");
//echo $tt-&Text();
//方法二:使用R()方法,造对象并且调用某个特定的方法
echo R("Admin/Text/Text");
运行结果:
4.命名空间namespace
相当于一个虚拟的目录
正常管理文件使用文件夹--物理区分
TP框架的初始命名空间是:ThinkPHP\Library
在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\Library)
1.系统目录下根命名空间是ThinkPHP\Library下面的文件夹名称命名的
2.模块的根命名空间是以模块名命名的
在定义命名空间的时候需要从根写起例如:Home\Controller 例如:Think\Model
如果要使用某个类文件,引入该类命名空间的时候:使用use关键字,后面写该类的命名空间 后面加上 "\文件名"
如果不想引入命名空间:在造类的对象的时候可以使用\(初始命名空间)来找到对应的类例如:new \Think\Page(30);
阅读(...) 评论()

我要回帖

更多关于 thinkphp 获取控制器 的文章

 

随机推荐