PHP的yaf框架自带插件

Yaf 框架的插件方法触发流程遵循一定的顺序,具体流程如下

  1. Bootstrap 类的 _initPlugin 方法:在 Yaf 应用程序启动时,首先会执行 Bootstrap 类的 _initPlugin 方法。在这个方法中,你可以注册各种插件。例如:
phpCopy code
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
    $myPlugin = new MyPlugin();
    $dispatcher->registerPlugin($myPlugin);
}

这样,你可以在应用程序启动时将自定义插件注册到 Yaf 框架中。

  1. 请求处理周期的各个阶段:在 Yaf 框架中,请求的处理被分为多个阶段,每个阶段都可以触发相应的插件方法。插件方法的触发顺序如下:
    • routerStartup 方法:在路由开始之前触发。可以用于执行路由前的操作。
    • 路由过程:Yaf 框架进行路由匹配,找到相应的控制器和动作。
    • routerShutdown 方法:在路由结束后触发。可以用于执行路由后的操作。
    • dispatchLoopStartup 方法:在分发循周期开始之前触发。可以用于执行分发循环前的操作。
    • 控制器动作的执行:Yaf 框架执行匹配到的控制器动作。
    • preDispatch 方法:在控制器动作执行之前触发。可以用于执行控制器动作前的操作。
    • 控制器动作的执行:控制器动作执行。
    • postDispatch 方法:在控制器动作执行之后触发。可以用于执行控制器动作后的操作。
    • dispatchLoopShutdown 方法:在分发循周期结束之后触发。可以用于执行分发循环后的操作。
  1. preResponse 方法:在响应发送到客户端之前触发。可以用于修改响应内容、设置响应头等操作。
  2. 错误处理:如果在任何阶段发生了错误,Yaf 框架会触发错误处理,此时会执行 preError 方法。

首先要注册插件,yaf框架插件中自带的有六种方法。

class UserPlugin extends Plugin_Abstract
{
    //在路由之前触发,这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成
    public function routerStartup(Request_Abstract $request, Response_Abstract $response)
    {

    }

    //路由结束之后触发,此时路由一定正确完成, 否则这个事件不会触发
    public function routerShutdown(Request_Abstract $request, Response_Abstract $response)
    {
       
    }

    //分发循环开始之前被触发
    public function dispatchLoopStartup(Request_Abstract $request, Response_Abstract $response)
    {

    }

    //分发之前触发    如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次
    public function preDispatch(Request_Abstract $request, Response_Abstract $response)
    {

    }

    //分发结束之后触发,此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次
    public function postDispatch(Request_Abstract $request, Response_Abstract $response)
    {

    }

    //分发循环结束之后触发,此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送
    public function dispatchLoopShutdown(Request_Abstract $request, Response_Abstract $response)
    {

    }

简单解释

  1. preDispatch 方法
    • 插件方法名称:preDispatch
    • 解释:在控制器动作执行之前执行。这是一个常用的插件方法,用于在控制器动作开始之前执行一些操作,如权限检查、请求预处理、日志记录等。你可以在这个阶段干预请求的处理流程。
  1. postDispatch 方法
    • 插件方法名称:postDispatch
    • 解释:在控制器动作执行之后执行。这是另一个常用的插件方法,用于在控制器动作执行完毕后执行一些操作,如记录响应、数据处理等。你可以在这个阶段对请求的结果进行后处理。
  1. preResponse 方法
    • 插件方法名称:preResponse
    • 解释:在响应被发送到客户端之前执行。这个方法允许你在响应最终发送之前修改响应内容、设置响应头等操作。
  1. routerStartup 方法
    • 插件方法名称:routerStartup
    • 解释:在路由开始之前执行。这个方法通常用于在路由阶段执行某些操作,如 URL 重写、路由初始化等。你可以在这个阶段对路由进行干预。
  1. routerShutdown 方法
    • 插件方法名称:routerShutdown
    • 解释:在路由完成之后执行。这个方法用于在路由阶段执行某些操作,如记录路由信息、执行路由后处理等。你可以在这个阶段对路由结果进行后处理。
  1. dispatchLoopStartup 方法
    • 插件方法名称:dispatchLoopStartup
    • 解释:在分发循环开始之前执行。这个方法通常用于在分发循环开始前执行某些全局初始化操作,如权限检查、全局数据准备等。
  1. dispatchLoopShutdown 方法
    • 插件方法名称:dispatchLoopShutdown
    • 解释:在分发循环结束之后执行。这个方法用于在分发循环结束后执行某些全局清理操作,如统计请求处理时间、数据清理等。
  1. preError 方法
    • 插件方法名称:preError
    • 解释:在处理错误之前执行。这个方法用于在错误处理阶段执行某些操作,如记录错误信息、自定义错误页面等。

为什么触发了preDispatch,而没有触发PostDispatch?

  1. 异常抛出:如果在控制器动作执行期间抛出了未捕获的异常,这可能导致请求未正常完成,因此 postDispatch 不会被调用。确保你的控制器动作和代码中没有未捕获的异常。
  2. 控制器动作执行期间的重定向:如果在控制器动作执行期间执行了重定向操作(例如使用 $this->_redirect()),则请求可能会被提前终止,这也可能导致 postDispatch 未触发。
  3. Yaf 配置问题:检查 Yaf 框架的配置文件,确保插件被正确注册。在应用的 Bootstrap 文件中或配置文件中,确保已经为插件注册了 MyPlugin 类,并且没有错误拼写或语法问题。
  4. 插件的执行条件:确保 postDispatch 方法中的代码没有条件限制,如 if 语句,可能会导致它未被执行。
  5. 插件方法执行顺序:在 Yaf 插件中,方法的执行顺序是固定的,preDispatch 方法会在控制器动作之前执行,而 postDispatch 方法会在控制器动作之后执行。确保没有自定义逻辑或条件会导致 postDispatch 被绕过。

怎样记录日志

如果你想使用 Monolog 记录所有的操作记录日志,你需要在适当的地方调用 Monolog 记录日志的方法,以便将操作记录写入日志文件或其他目标。以下是一个示例,演示如何在 Yaf 框架中使用 Monolog 记录所有的操作记录:

首先,确保你已经安装了 Monolog,可以使用 Composer 进行安装:

composer require monolog/monolog

然后,在 Yaf 框架中的适当位置,例如控制器中,使用 Monolog 记录操作记录。在以下示例中,我们将记录操作记录到一个名为 operation.log 的文件:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class UserController extends Yaf\Controller_Abstract {
    public function addAction() {
        // 用户执行了添加操作
        $userId = 1;  // 从用户会话或其他方式获取用户ID
        $actionType = 'add';  // 操作类型,可以是 'add', 'update', 'delete' 等
        $actionContent = 'User added a new item';  // 操作内容描述

        // 创建 Monolog 日志实例
        $log = new Logger('operation_log');

        // 添加一个日志处理程序,将日志写入文件
        $log->pushHandler(new StreamHandler('runtime/operation.log', Logger::INFO));

        // 记录操作记录
        $log->info("User $userId: $actionType - $actionContent");

        // 其他添加操作的逻辑
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值