在 Yaf 框架中,插件机制是如何工作的?请描述插件的完整生命周期,包括各个阶段触发时机和典型用途。
考察说明
考察对 Yaf 框架插件机制及其生命周期钩子顺序的理解
回答思路
- 【回答框架 1】Yaf 插件通过继承 Yaf_Plugin_Abstract 实现,需在 Bootstrap 中用 Yaf_Register_Plugin 注册。插件生命周期由路由、分发、视图渲染等环节的钩子方法组成,框架按固定顺序自动调用。
- 【回答框架 2】生命周期常规顺序为 routerStartup(路由开始前)、routerShutdown(路由结束后)、dispatchLoopStartup(分发循环开始前)、preDispatch(分发前)、preResponse(响应前)、postDispatch(分发后)和 dispatchLoopShutdown(分发循环结束)。注意 preDispatch 和 postDispatch 在每次循环迭代中触发,而循环级钩子仅触发一次。
- 【回答框架 3】路由阶段在 routerStartup 后可修改请求对象实现前置逻辑,routerShutdown 后路由结果已定,适合记录路由信息。分发阶段 preDispatch 可做权限校验,postDispatch 可做日志或清理,preResponse 在响应输出前可修改响应体。插件间同名钩子按注册顺序执行。
- 【回答框架 4】该机制与事件监听器类似但更硬编码,钩子固定由框架触发,无需手动派发。使用时优先将通用横切逻辑放入插件,避免在控制器重复代码,但需注意钩子触发顺序和频率以避免副作用。
- 【关键点 1】插件通过继承 Yaf_Plugin_Abstract 并注册到框架,生命周期钩子固定顺序触发
- 【关键点 2】生命周期主要分为路由、分发循环、响应前后三大阶段,分发循环内钩子可多次触发
- 【关键点 3】钩子方法可接收 request 和 response 对象,便于横切操作
- 【易错点 1】混淆 preDispatch 与 routerShutdown 的触发时机,导致逻辑在错误阶段执行
- 【易错点 2】未考虑分发循环可能多次执行,在 preDispatch 中放置只应执行一次的初始化逻辑
- 【易错点 3】在 preResponse 中修改响应头或体时忽略输出缓冲状态,可能产生异常