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+DBM的同学录程序(5)
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
php生成略缩图代码
Jul 16 PHP
php实现文件下载更能介绍
Nov 23 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
Joomla语言翻译类Jtext用法分析
May 05 PHP
php抽象方法和抽象类实例分析
Dec 07 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP Swoole异步MySQL客户端实现方法示例
Oct 24 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP7匿名类用法分析
2016/09/26 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
JS实现self的resend
2010/07/22 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python基础教程之缩进介绍
2014/08/29 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
详解python时间模块中的datetime模块
2016/01/13 Python
python 基础教程之Map使用方法
2017/01/17 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
浅谈python中的占位符
2017/11/09 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
2014年国培研修感言
2014/03/09 职场文书
节能环保标语
2014/06/12 职场文书
环卫工人节活动总结
2014/08/29 职场文书
2014年个人售房协议书
2014/10/30 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
Python基础之条件语句详解
2021/06/16 Python
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
如何在Python中妥善使用进度条详解
2022/04/05 Python