作为CodeIgniter开发人员,有时您最终会遇到需要更改框架核心或执行流程以满足自定义要求的情况。 当然,从不建议修改核心文件,因为它会使升级过程变得繁琐。 幸运的是,钩子系统附带了CodeIgniter框架,使您可以处理这种情况。
在本文中,我们将首先介绍CodeIgniter框架中的hooks系统。 然后,我们将讨论可用的不同类型的挂钩。 最后,我们将抓住这个机会来探索自定义钩子的创建。
挂钩:覆盖核心框架的系统
让我们快速看一下CodeIgniter官方文档中有关钩子系统的内容:
CodeIgniter的Hooks功能提供了一种方法,可以利用和修改框架的内部工作而不会破坏核心文件。
听起来很不言自明,不是吗? 在日常应用程序开发中,如果您发现自己想修改核心CodeIgniter文件,则应首先考虑hooks系统,看它是否满足您的要求。
假设您要构建一个自定义性能基准测试系统来监视应用程序的执行。 您意识到需要修改核心文件才能获得所需的输出。 在这种情况下,您可以使用pre_system
和post_system
挂钩进入执行流程并根据需要收集统计信息。
如果您知道事件观察者模式,则概念类似,因为您侦听系统生成的事件,并且在触发观察到的事件时执行相应的观察者代码。
因此,这是对CodeIgniter中的hooks系统的基本介绍。 在下一节中,我们将详细介绍可用于插入系统的各种挂钩。
经历不同的钩子
CodeIgniter挂钩系统提供了不同的挂钩点,您可以在实现自定义挂钩时使用它们。 挂钩点基本上是给定时间在请求执行工作流程中的某个状态。
例如,当您实现pre_system
挂钩时,您知道自己正处于引导阶段的开始。 另一方面,如果选择了post_system
挂钩,则可以确保执行已完成,并且响应已发送到客户端。
在本节中,我们将介绍CodeIgniter挂钩系统提供的不同挂钩点。
系统挂钩
pre_system
和post_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