CodeIgniter的挂钩系统如何工作

作为CodeIgniter开发人员,有时您最终会遇到需要更改框架核心或执行流程以满足自定义要求的情况。 当然,从不建议修改核心文件,因为它会使升级过程变得繁琐。 幸运的是,钩子系统附带了CodeIgniter框架,使您可以处理这种情况。

在本文中,我们将首先介绍CodeIgniter框架中的hooks系统。 然后,我们将讨论可用的不同类型的挂钩。 最后,我们将抓住这个机会来探索自定义钩子的创建。

挂钩:覆盖核心框架的系统

让我们快速看一下CodeIgniter官方文档中有关钩子系统的内容:

CodeIgniter的Hooks功能提供了一种方法,可以利用和修改框架的内部工作而不会破坏核心文件。

听起来很不言自明,不是吗? 在日常应用程序开发中,如果您发现自己想修改核心CodeIgniter文件,则应首先考虑hooks系统,看它是否满足您的要求。

假设您要构建一个自定义性能基准测试系统来监视应用程序的执行。 您意识到需要修改核心文件才能获得所需的输出。 在这种情况下,您可以使用pre_systempost_system挂钩进入执行流程并根据需要收集统计信息。

如果您知道事件观察者模式,则概念类似,因为您侦听系统生成的事件,并且在触发观察到的事件时执行相应的观察者代码。

因此,这是对CodeIgniter中的hooks系统的基本介绍。 在下一节中,我们将详细介绍可用于插入系统的各种挂钩。

经历不同的钩子

CodeIgniter挂钩系统提供了不同的挂钩点,您可以在实现自定义挂钩时使用它们。 挂钩点基本上是给定时间在请求执行工作流程中的某个状态。

例如,当您实现pre_system挂钩时,您知道自己正处于引导阶段的开始。 另一方面,如果选择了post_system挂钩,则可以确保执行已完成,并且响应已发送到客户端。

在本节中,我们将介绍CodeIgniter挂钩系统提供的不同挂钩点。

系统挂钩

pre_systempost_system挂钩属于此类别,因为前一个在引导阶段很早就被调用,而后一个在页面执行完成后被调用。

我可以想到一些可以通过系统挂钩实现的用例:

  • 基准测试
  • 记录中
  • 基于规则的重定向
  • 和更多

控制器挂钩

有3个钩子属于此类别,因此让我们逐一进行介绍。

预控制器挂钩

在实例化控制器类之前,将调用pre_controller挂钩。 因此,如果您想在调用控制器之前做进一步的检查,这就是您要寻找的钩子。

后控制器构造函数挂钩

顾名思义,在实例化控制器对象之后且在实际方法调用之前,将立即调用post_controller_constructor挂钩。

此时,您确定控制器已实例化,并且该方法将很快被调用,因此您可以在此处加载任何控制器特定的库,也可以实现控制器特定的自定义验证。

后控制器挂钩

在执行controller方法之后,将调用post_controller挂钩。 因此,您要在执行控制器后执行的任务应使用此钩子实现。

这就是控制器特定挂钩的故事。

覆盖钩子

显示替代挂钩

根据CodeIgniter文档, display_override钩子将覆盖核心_display方法。 核心_display方法用于将输出发送到客户端,因此,通过使用display_override钩子,您可以更改将输出发送到用户的方式。

实际上,当我们进入下一部分时,我们将详细探讨该钩子,在下一节中,我们将讨论如何创建自定义钩子。

缓存覆盖挂钩

所述cache_override钩覆盖芯_display_cache所述的方法Output类。 _display_cache方法负责提供缓存的输出,因此,如果您希望实现来自其他缓存位置的页面输出,则可以使用此挂钩。

到此结束CodeIgniter挂钩系统中不同挂钩点的故事。 在下一节中,我们将看到通过实现一个真实示例,您将如何充分利用钩子系统。

如何创建自定义挂钩

我确信到目前为止您已经掌握了足够的理论,所以让我们回到一些实际的开发中吧! 在本节中,我们将创建一个自定义钩子,以演示本文到目前为止讨论的概念。

在我们的例子中,我们将使用display_override钩子来替换令牌。 确切地说,我们将所有出现的[DATETIME]替换为当前日期。 当然,这听起来像是一个非常简单的用例,但是您可以根据自己的需求轻松扩展它,使其更加具体。

默认情况下,挂钩系统在核心框架中处于禁用状态,因此您需要做的第一件事就是启用挂钩系统。

继续并打开配置文件application/config/config.php

查找以下代码段,然后将FALSE更改为TRUE以将其打开。

<?php
/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the 'hooks' feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;

现在,我们准备定义钩子了。 实际上,CodeIgniter已经随附了文件application/config/hooks.php ,如果您希望定义钩子,可以使用该文件。

默认情况下, hooks.php文件为空,因此让我们添加自定义钩子代码以使其更有意义。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$hook['display_override'] = array(
        'class'    => 'ReplaceToken',
        'function' => 'replacePlaceholderCode',
        'filename' => 'ReplaceToken.php',
        'filepath' => 'hooks'
);

定义自定义钩子的语法非常简单。 这是$hook数组,其中包含所有需要执行的钩子。

每个数组条目的键都是您要定义的钩子本身的名称。 当您定义一个钩子时,您是在告诉系统发生某些事情时要执行一段代码。 这正是需要作为任何钩子的值提供的内容。 让我们快速浏览每个键。

  • class密钥包含一个类的名称,该类包含需要执行的代码。
  • function键包含挂钩执行时将调用的方法的名称。
  • filename键指向定义完整挂钩代码的文件。
  • filepath定义在filename键下声明的文件的目录路径,它是相对于application目录的。 通常,将其设置为hooks ,从而导致application/hooks结构。 当然,如果您愿意的话,没有什么可以阻止您定义完全不同的路径。

附带说明一下,如果您不想创建类文件,则还可以提供一个关闭函数,该函数将在钩子触发时执行。

在本例中,我们将创建一个文件ReplaceToken.php并根据挂钩定义将其放置在application/hooks目录下。

继续并使用以下内容创建文件application/hooks/ReplaceToken.php

<?php
class ReplaceToken {
  public function replacePlaceholderCode()
  {
      // load the instance
      $this->CI =& get_instance();
      
      // get the actual output
      $contents = $this->CI->output->get_output();
      
      // replace the tokens
      $this->CI->load->helper('date');
      $contents = str_replace("[DATETIME]", standard_date(), $contents);
      
      // set the output
      echo $contents;
      return;
  }
}

我们挂钩的目的是在将应用程序中任何页面的输出发送到客户端之前,用实际日期替换[DATETIME]占位符。

正如我们前面所讨论的,在调用display_override钩子时,页面的输出已经建立。 因此,我们要做的第一件事是获取准备发送给用户的输出。

// load the instance
$this->CI =& get_instance();

// get the actual output
$contents = $this->CI->output->get_output();

get_instance方法用于实例化应用程序实例,并将其分配给$this->CI 。 接下来,我们使用Output类的get_output方法获取响应内容。

其余的非常简单。 [DATETIME]占位符需要替换为实际日期。 为了使事情变得更容易,使用了date助手来执行所需的操作,就钩子逻辑而言,我们差不多已经完成了。

// replace the tokens
$this->CI->load->helper('date');
$contents = str_replace("[DATETIME]", standard_date(), $contents);

最后,您需要回显输出,因为display_override会覆盖用于将输出发送到客户端的_display方法。 因此,在这种情况下,我们需要自己做; 否则,它将由核心_display方法处理。

// set the output
echo $contents;
return;

实际上,这结束了我们自定义钩子的故事!

现在,让我们继续制作一个新的CodeIgniter页面,以便我们可以测试自定义钩子。 使用以下内容创建一个控制器文件application/controllers/TokenExample.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class TokenExample extends CI_Controller {
    public function index()
    {
        $this->load->view('token_content');
    }
}

这是关联的视图文件application/views/token_content.php外观。

Today's date: [DATETIME]

就是这样。 将浏览器指向http:// your-code-igniter-site-url / TokenExample / index ,您应该会看到预期的输出!

因此,如果您希望进入CodeIgniter应用程序的典型工作流程,这就是您可以使用的挂钩系统。 我希望您喜欢这篇文章,并且对您日常的CodeIgniter应用程序开发有帮助。

结论

今天,我们经历了令人兴奋的内置CodeIgniter功能之一-钩子。 挂钩允许您干预CodeIgniter应用程序的典型请求执行工作流程。

在本文的开头,我们讨论了CodeIgniter中的Hook的基本概念,然后讨论了系统中可用的各种Hook。 最后,在最后一节中,我们探讨了如何创建自定义钩子及其内部功能。

不要犹豫,使用下面的提要来表达您的想法。 另外,如果您想让我提出任何特定的主题,请告诉我。

翻译自: https://code.tutsplus.com/tutorials/how-codeigniter-hook-system-works--cms-29301

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值