当前位置: 首页 > news >正文

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");// 其他添加操作的逻辑}
}

相关文章:

PHP的yaf框架自带插件

Yaf 框架的插件方法触发流程遵循一定的顺序,具体流程如下 Bootstrap 类的 _initPlugin 方法:在 Yaf 应用程序启动时,首先会执行 Bootstrap 类的 _initPlugin 方法。在这个方法中,你可以注册各种插件。例如: phpCopy …...

SpringCloud Alibaba【三】Gateway

Gateway配置与使用 前言新建gateway子项目pom.xml配置文件启动类访问接口方式 测试拓展 前言 在工作中遇到一种情况,一个父项目中有两个子项目。实际使用时,需要外网可以访问,宝信软件只能将一个端口号发布在外网上,所以需要运用…...

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里,你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…...

C语言十进制转其它进制

短除法介绍 短除法: 主要功能为将十进制数据转为其它进制的数据,假设我们要转换为 X 进制,那么具体的流程如下: 十进制数字不断除以 X,直到商为 0 记录每次计算得到的余数 将余数倒序输出,即为对应的 X 进…...

网络建设 之 React数据管理

React作为一个用于构建用户界面的JavaScript库,很多人认为React仅仅只是一个UI 库,而不是一个前端框架,因为它在数据管理上是缺失的。在做一个小项目的时候,维护的数据量不多,管理/维护数据用useState/useRef就足够了&…...

如何隐藏woocommerce 后台header,woocommerce-layout__header

如何隐藏woocommerce 后台header,woocommerce-layout__header WooCommerce |Products Store Activity| Inbox| Orders| Stock| Reviews| Notices| breadcrumbs 在 functions.php 里添加如下代码即可: // Disable WooCommerce Header in WordPress Admi…...

通俗易懂的理解 解耦 概念

解耦(Decoupling)是计算机科学和软件工程中的一个概念,指的是降低系统中不同部分之间的依赖性,使系统的各个组件能够相对独立地进行开发、维护和演化。解耦的主要目标是减少组件之间的紧密耦合,以提高系统的灵活性、可…...

全志A40i android7.1 增加Vlan功能

一,VLAN基础知识 1.VLAN的定义: VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从…...

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 (1)四元组的唯一性 (2)数据的传输过程 (3)NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 (1)游戏加…...

关于报错java.util.ConcurrentModificationException: null的源码分析和解决

一般有这种问题,方法中至少会有List或者Map下的至少两个子类,有可能参数类型相同,也有可能不同都有可能触发这个问题!其主要原因是使用了ArrayList进行删除操作或者使用iterator遍历集合的同时对集合进行修改都有可能会出现这个问题 ArrayList属于List下的子类 需要区分的是Li…...

使用koa搭建服务器(一)

最近有个需求需要使用到koa搭建服务器并编写接口对数据库进行增删改查,因此写一篇博客记录这段时间的收获。 一、新建koa项目 (一)安装koa及其相关依赖 npm i koa npm i koa-router// 中间件,用于匹配路由 npm i koa-bodyparse…...

echarts的柱状图的重叠和堆叠实现两个柱体的显示和之前的差值显示

效果图 主要思路 准备三个柱体(原计划,实际进度,差值) 原计划和实际进度设置成重叠 {barWidth: 20,// yAxisIndex: 1,z: 1,name: 原计划,type: bar,stack: ab,emphasis: { // 点击柱体其他柱体颜色会变浅disabled: true},label…...

泛积木-低代码 使用攻略

文档首发于 泛积木-低代码 使用攻略 我们以大纲的方式(总体把握)讲述如何高效、便捷使用 泛积木-低代码。 权限 首先说下权限,在 系统设置 / 权限设置 菜单内,我们可以新增调整项目内的权限,默认拥有管理员和成员两…...

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写

红队专题 招募六边形战士队员[1]远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境:3.界面编程新建项目…...

机器学习(五)如何理解机器学习三要素

1.8如何理解机器学习三要素 统计学习模型策略算法 模型:规律yaxb 策略:什么样的模型是好的模型?损失函数 算法:如何高效找到最优参数,模型中的参数a和b 1.8.1模型 机器学习中,首先要考虑学习什么样的…...

【计算机视觉】3D视觉

文章目录 一、基本问题二、三个坐标系 X w \boldsymbol{X}_w Xw​到 X c \boldsymbol{X}_c Xc​的转换 X c \boldsymbol{X}_c Xc​到 x i \boldsymbol{x}_i xi​的转换投影矩阵尺度模糊问题 三、相机标定四、立体视觉 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#x…...

策略路由和路由策略

目录 策略路由 路由策略 策略路由和路由策略 策略路由 Step1:配置ACL,匹配流量 acl number 2010 rule 10 permit source 192.168.10.0 0.0.0.255 acl number 2020 rule 10 permit source 192.168.20.0 0.0.0.255 Step2:流分类traffic classifier jiaoxue //匹配…...

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数 文章目录 [动态规划] (一) LeetCode 1137.第N个泰波那契数题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结空间优化代码实现 总结 1137. 第 N 个泰波那契数 题目解析 解题思路 状态表示 (1) 题目要…...

SystemVerilog语法中,在Class中引用层次化信号

在class中可以像在verilog中一样,直接在class中引用层次化信号。示例如下: 1.DUT模块,文件名为top.v。 module top (input clk ,input rst_n ,//总线信号 input wr_n ,input rd_n ,input cs0_n ,input cs7_n …...

磁盘的结构(磁道,扇区,盘面,柱面,物理地址)

目录 1.磁盘、磁道、扇区的概念1.磁盘2.磁道3.扇区 2.如何在磁盘中读/写数据3.盘面、柱面的概念4.磁盘的物理地址1.根据地址读取一个“块” 5.磁盘的分类1.活动头磁道2.固定头磁盘3.根据盘片是否可更换 1.磁盘、磁道、扇区的概念 1.磁盘 磁盘的表面由一些磁性物质组成&#xf…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...