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 相关文章推荐
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
PHP 程序授权验证开发思路
Jul 09 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
PHPThumb图片处理实例
May 03 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
php查询whois信息的方法
Jun 08 PHP
php上传图片类及用法示例
May 11 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
PHP函数积累总结
Mar 19 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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
php 文件上传类代码
2011/08/06 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
php 函数中使用static的说明
2012/06/01 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
PHP7 新增常量
2021/03/09 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
python搜索算法原理及实例讲解
2020/11/18 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
高级运动鞋:GREATS
2019/07/19 全球购物
经典广告词大全
2014/03/14 职场文书
商铺租房协议书范本
2014/12/04 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL