thinkphp控制器调度使用示例


Posted in PHP onFebruary 24, 2014

1.如何通过地址栏参数来得到模块名称和控制器名称(即使在有路由和开了重写模块的情况下)

2.tp是如何实现前置,后置方法功能模块,和如何执行带参数的方法?

php系统自带的 ReflectionClass,ReflectionMethod 类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行

ReflectionClass主要用的方法: 
hasMethod(string)  是否存在某个方法
getMethod(string)   获取方法

ReflectionMethod 主要方法: 
getNumberOfParameters()  获取参数个数
getParamters()  获取参数信息

3.代码演示

<?php 
class IndexAction{
 public function index(){
   echo 'index'."\r\n";
 }
 public function test($year=2012,$month=2,$day=21){
   echo $year.'--------'.$month.'-----------'.$day."\r\n";
 }
 public function _before_index(){
   echo __FUNCTION__."\r\n";
 }
 public function _after_index(){
   echo __FUNCTION__."\r\n";
 }
}
//执行index方法
$method = new ReflectionMethod('IndexAction','index');
//进行权限判断
if($method->isPublic()){
 $class = new ReflectionClass('IndexAction');
 //执行前置方法
 if($class->hasMethod('_before_index')){
  $beforeMethod = $class->getMethod('_before_index');
  if($beforeMethod->isPublic()){
   $beforeMethod->invoke(new IndexAction);
  }
 }
 $method->invoke(new IndexAction);
 //执行后置方法
 if($class->hasMethod('_after_index')){
  $beforeMethod = $class->getMethod('_after_index');
  if($beforeMethod->isPublic()){
   $beforeMethod->invoke(new IndexAction);
  }
 }
}

//执行带参数的方法
$method = new ReflectionMethod('IndexAction','test');
$params = $method->getParameters();
foreach($params as $param ){
 $paramName = $param->getName();
 if(isset($_REQUEST[$paramName]))
  $args[] = $_REQUEST[$paramName];
 elseif($param->isDefaultValueAvailable())
  $args[] = $param->getDefaultValue();
}
if(count($args)==$method->getNumberOfParameters())
 $method->invokeArgs(new IndexAction,$args);
else
 echo 'parameters is not match!';
PHP 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php实现下载限制速度示例分享
Feb 13 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
PHP引用的调用方法分析
Apr 25 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
Laravel手动返回错误码示例
Oct 22 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 #PHP
将php数组输出html表格的方法
Feb 24 #PHP
php格式化日期和时间格式化示例分享
Feb 24 #PHP
php目录操作实例代码
Feb 21 #PHP
php无限遍历目录示例
Feb 21 #PHP
php自动加载autoload机制示例分享
Feb 20 #PHP
php多文件上传下载示例分享
Feb 20 #PHP
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
使用Django和Python创建Json response的方法
2018/03/26 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python命令行工具Click快速掌握
2019/07/04 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
法学专业本科生自荐信范文
2013/12/17 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
离婚协议书范文2014
2014/10/16 职场文书
关于安全的广播稿
2014/10/23 职场文书
毕业赠语大全
2015/06/23 职场文书
行政复议决定书
2015/06/24 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
python函数的两种嵌套方法使用
2022/04/02 Python
Django中celery的使用项目实例
2022/07/07 Python