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源代码
Oct 09 PHP
cmd下运行php脚本
Nov 25 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
php 将excel导入mysql
Nov 09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
php实现图片缩略图的方法
Mar 29 PHP
实例讲解php实现多线程
Jan 27 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 PHP
php使用json-schema模块实现json校验示例
Sep 28 PHP
laravel 根据不同组织加载不同视图的实现
Oct 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
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
python中实现php的var_dump函数功能
2015/01/21 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
python生成特定分布数的实例
2019/12/05 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
上班迟到检讨书
2014/09/15 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
大学生个人学年总结
2015/02/15 职场文书
公司回复函格式
2015/07/14 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android