zoukankan      html  css  js  c++  java
  • php优秀框架codeigniter学习系列——hooks

      这篇文章学习CI框架的钩子特性。

      hooks是CI框架提供的一种机制,允许你在程序框架运行流程的某个阶段执行你自己的一些代码。比如系统运行前,CI_Controller调用前,系统运行结束后等特定的时间节点,执行自定义的函数。如同官方所言,CodeIgniter 的钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改 核心文件。

      hooks的逻辑主要写在system/core/Hooks.php的CI_Hooks类中。框架在Codeigniter.php中载入该类。

    1 /*
    2  * ------------------------------------------------------
    3  *  Instantiate the hooks class
    4  * ------------------------------------------------------
    5  */
    6     $EXT =& load_class('Hooks', 'core');

      在初始化CI_Hooks类的时候,程序会读取在application/config/hooks.php中定义的$hooks数组,并且保存到类成员属性$this->hooks 中,注意这里是引用传递值。$hooks数组的定义可以采用如下方式定义:

    1 $hook['pre_controller'] = array(
    2     'class'    => 'MyClass',
    3     'function' => 'Myfunction',
    4     'filename' => 'Myclass.php',
    5     'filepath' => 'hooks',
    6     'params'   => array('beer', 'wine', 'snacks')
    7 );

      数组的索引pre_controller称为挂钩点,在这里指在你的控制器调用之前执行。还有很多的挂钩点,具体可以参看官方说明

      _run_hook 是真正调用的CI_Hooks类中真正调用钩子的方法。它先判断该钩子是何种形式,如果是ambda 表达式/匿名函数(或闭包)作为钩子,则直接执行。如果是以数组的形式设置,则会去找到文件。进一步处理。值得注意的是,程序会把钩子的类的实例保存在类成员$this->_objects中,以便还有钩子调用该类的时候直接使用,不用再实例化。个人觉得这种钩子会重复使用同一个钩子的情况不太常见,有些没必要,但是没有实际案例使用,也许作者有自己的考虑吧。

      注意,钩子的调用是同步执行。

      call_hook函数是暴露给外部执行挂钩点钩子的方法,同一挂钩点可以设置多个钩子。

      实例:如果你在application/hooks/文件夹中,新建Myclass.php文件,输入以下内容,就会看到呈现。

    <?php
    class MyClass{
        public function Myfunction($param){
            is_array($param) && $str = implode(",", $param);
            !is_array($param) && $str = $parm;
            echo $str."<br/>";
        }
        
    }

      

  • 相关阅读:
    对于函数中多个返回值的处理
    Docker-compose 安裝单机版redis
    设计模式七大设计原则
    UML 设计技巧
    使用Docker 容器配置nexus3.29 私有仓库
    分布式消息Kafka通信原理分析
    分布式消息Kafka通信
    使用docker 搭建nexus3.29
    分布式消息Kafka初步认识及基本应用
    Dubbo 常用配置及源码分析
  • 原文地址:https://www.cnblogs.com/Andres/p/8994367.html
Copyright © 2011-2022 走看看