• PHP的yaf框架自带插件


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

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

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

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

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

    1. class UserPlugin extends Plugin_Abstract
    2. {
    3. //在路由之前触发,这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成
    4. public function routerStartup(Request_Abstract $request, Response_Abstract $response)
    5. {
    6. }
    7. //路由结束之后触发,此时路由一定正确完成, 否则这个事件不会触发
    8. public function routerShutdown(Request_Abstract $request, Response_Abstract $response)
    9. {
    10. }
    11. //分发循环开始之前被触发
    12. public function dispatchLoopStartup(Request_Abstract $request, Response_Abstract $response)
    13. {
    14. }
    15. //分发之前触发 如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次
    16. public function preDispatch(Request_Abstract $request, Response_Abstract $response)
    17. {
    18. }
    19. //分发结束之后触发,此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次
    20. public function postDispatch(Request_Abstract $request, Response_Abstract $response)
    21. {
    22. }
    23. //分发循环结束之后触发,此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送
    24. public function dispatchLoopShutdown(Request_Abstract $request, Response_Abstract $response)
    25. {
    26. }

    简单解释

    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 的文件:

    1. use Monolog\Logger;
    2. use Monolog\Handler\StreamHandler;
    3. class UserController extends Yaf\Controller_Abstract {
    4. public function addAction() {
    5. // 用户执行了添加操作
    6. $userId = 1; // 从用户会话或其他方式获取用户ID
    7. $actionType = 'add'; // 操作类型,可以是 'add', 'update', 'delete'
    8. $actionContent = 'User added a new item'; // 操作内容描述
    9. // 创建 Monolog 日志实例
    10. $log = new Logger('operation_log');
    11. // 添加一个日志处理程序,将日志写入文件
    12. $log->pushHandler(new StreamHandler('runtime/operation.log', Logger::INFO));
    13. // 记录操作记录
    14. $log->info("User $userId: $actionType - $actionContent");
    15. // 其他添加操作的逻辑
    16. }
    17. }
  • 相关阅读:
    养殖废水总氮超标的解决方法
    Go ZIP压缩文件读写操作
    CMake笔记
    (蓝桥杯第十四届c解法,部分题目)​一、冶炼金属​二、飞机降落
    链表反转 及 个人理解思路(链表操作入门)
    hibernate源码(1)--- schema创建
    nginx网站服务
    ToPrimitive原理
    Visual Studio 2022 正式支持 .NET MAUI 开发
    pink老师前端CSS教程案例-学成在线首页
  • 原文地址:https://blog.csdn.net/m1215339620/article/details/134093151