注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

PHP CodeIgniter(CI) 的钩子(hooks) 与 thinkphp 中的 行为扩展、标签 有何不同(iwebshop)?  

2013-12-10 17:12:40|  分类: Web技术-应用研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们首先一个个来说。
一 PHP CI框架HOOKS(钩子):
如何使用?
1 首先定义hooks 类,在/application/hooks/Myclass.php
  <?php
   class Myclass
   {
      public function Myfunction(){}
   }

2 对接挂载点在/application/config/hooks.php 配置:
//在控制器实例化之后,任何方法调用之前调用.
$hook['pre_controller'] = array(
                                'class'    => 'MyClass',
                                'function' => 'Myfunction',
                                'filename' => 'Myclass.php',
                                'filepath' => 'hooks',
                                'params'   => array('beer', 'wine', 'snacks')
                                );

这样就设置好了hooks类了。

原理:

在框架的核心文件system/core/CodeIniter.php文件的 122行,载入Hooks类,随后下面就定义了几个挂载点。如 129行是pre_system挂载点、295行是post_controller_constructor挂载点等。
执行定义(配置)好的hooks功能在 system/core/Hooks.php 文件的99行 _call_hook() 方法。
从此方法可以看出:执行某挂载点的hooks,就是执行定义在application/config/hooks.php 中的类方法。

二:ThinkPHP 行为扩展和标签

 thinkphp中的行为扩展、标签(挂载点)与CI、iwebshop等框架的实现方式也相似,默认情况下也定义了多个标签位(挂载点),
 如:app_init(项目初始化标签) 、app_begin(项目开始标签) 等,不过只了内置的标签位外,还可以任意自定义标签位,使用
 tag('xxx'); 方法。

 如何使用?
 1 实义行为扩展类(以语言包为例)
   在/Lib/Behavior/目录中定义行为类 CheckLangBehavior.class.php。
class CheckLangBehavior extends Behavior {

    // 行为参数定义(默认值) 可在项目配置中覆盖
    protected $options   =  array(
            'LANG_SWITCH_ON'        => false,   // 默认关闭语言包功能
    .........
        );

    // 行为扩展的执行入口必须是run
    public function run(&$params){
       
        $this->checkLanguage();
    }   

  2 定义好行为类后,在项目目录/Conf/目录下,设置tags.php文件:
<?php
return array(
    'app_begin'=>array(  
        'CheckLang'      //项目开始时检测语言
    ),
);
  
 3 定义标签位(挂载点)
   由于app_begin 标签位是内置的,所以我们不需要设置了,不过可以看一下,在/includes/thinkphp/Lib/Core/App.class.php
   149行 run() 方法中:
   static public function run() {
// 项目初始化标签
tag('app_init');
App::init();
// 项目开始标签
tag('app_begin');
 这样,设置以后CheckLang行为就自动挂载到需要的地方了。

 原理:
   要想知道原理,我们就得知道tag()里做了什么,我们在/includes/thinkphp/Common/common.php 中
   568行找到tag()方法,通读后,我们知道在tag()里找到对应标签位(挂截点)上的所有行为类后,循环
   的实例化它们(B($name,$params)),然后执行行为的run()方法。 
  只际上,thinkphp还提供了一种方式使用行为,就是不走标签位(挂载点)。直接在控制器_initialize()方法中使用
  B('CheckLang')。


三 最后我们再来说说iwebshop拦截器:
如何使用(我们创建一个执行任何动作前的拦截器)?
1 创建拦截动作
首先我们在CheckRights类中实现onCreateAction方法。
/**
 * 创建动作拦截
 */
public static function onCreateAction()
{
//这里实现权限检查
}

2 然后,我们在某控制器中,将CheckRights类注册到onCreateAction点,

IInterceptor::reg('CheckRights@onCreateAction');


这样,在控制器中执行任何作动前都会检查权限。

原理:
iwebshop拦截器做法与ci框架相似,也是内置了几处拦截点。不过,创建(定义)一个拦截器有所不同,iwebshop是将某个类注册到某个拦截点,并且此类必须实现拦截点的具体能功才行(如上面的IInterceptor::reg('CheckRights@onCreateAction') ,表示CheckRights类中必须得实现onCreateAction具体方法)。实际上我们通过分析拦截器文件 /lib/core/interceptor_class.php 中IInterceptor类的run() 方法可以看出,就是在被注册类中执行拦截点方法。

call_user_func( array($value,$position) );




从上面我们分析后,可以看出来不管是ci框架的hooks,还是thinkphp的行为、标签,还是iwebshop的拦截器,都是事先在系统里定义好挂载点,然后再在挂载点上执行系统外定义的类等,只是实现执行方法有点点不同。
  评论这张
 
阅读(969)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017