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生成随机密码的几种方法
Jan 17 PHP
基于PHP常用函数的用法详解
May 10 PHP
php获取字段名示例分享
Mar 03 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
YII Framework框架教程之日志用法详解
Mar 14 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
Mar 21 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
php取出数组单个值的方法
Mar 12 PHP
PHP的PDO连接讲解
Jan 24 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
基于mysql的论坛(3)
2006/10/09 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
Vue.js数据绑定之data属性
2017/07/07 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python正则表达式完全指南
2017/05/25 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
python定位xpath 节点位置的方法
2019/08/27 Python
keras 权重保存和权重载入方式
2020/05/21 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
电子信息工程专业自荐书
2014/06/24 职场文书
群众路线对照检查材料
2014/09/22 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
JavaScript实现音乐播放器
2022/08/14 Javascript