热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Yaf零基础学习总结7-学习使用Yaf中的插件

Yaf支持用户定义插件来扩展Yaf的功能,这些插件都是一些类.它们都必须继承自Yaf_Plugin_Abstract.插件要发挥功效,也必须现实的在Yaf中进行注册,然后在适当的实际,Yaf就会调用它.
Yaf支持用户定义插件来扩展Yaf的功能, 这些插件都是一些类. 它们都必须继承自Yaf_Plugin_Abstract. 插件要发挥功效, 也必须现实的在Yaf中进行注册, 然后在适当的实际, Yaf就会调用它. 

也许大家会问这个插件是个什么概念,有什么用呢,其实我们用插件主要是用到Yaf框架中支持的Hook(钩子),Yaf中定义了6个Hook,他们分别是: 

Yaf中支持的6个Hook 

1、routerStartup 这个会在路由之前出发,也就是路由之前会调用这个Hook ,这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成 

2、routerShutdown 这个在路由结束之后触发,需要注意的是,只有路由正确完成之后才会触发这个Hook 

3、dispatchLoopStartup 分发循环开始之前被触发 

4、preDispatch 分发之前触发,如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次 

5、postDispatch 分发结束之后触发,此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次 

6、dispatchLoopShutdown 分发循环结束之后触发 此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送 

定义插件 

以上只是对插件做了一个基本的介绍,如果此前没有接触过类似设计的可能一下子稀里糊涂的,其实也没关系,当前最重要的就是记住,有这么个印象,在后续我们使用的过程当中慢慢的就能接受了。 

插件类是用户编写的, 但是它需要继承自Yaf_Plugin_Abstract. 对于插件来说, 上一节提到的7个Hook, 它不需要全部关心, 它只需要在插件类中定义和上面事件同名的方法, 那么这个方法就会在该事件触发的时候被调用. 

而插件方法, 可以接受俩个参数, Yaf_Request_Abstract实例和Yaf_Response_Abstract实例. 一个插件类例子如下: 




注册插件 

插件要生效, 还需要向Yaf_Dispatcher注册, 那么一般的插件的注册都会放在Bootstra中进行. 一个注册插件的例子如下: 
[php] view plaincopy
registerPlugin($user);  
        }  
}  


插件目录 

一般的, 插件应该放置在APPLICATION_PATH下的plugins目录, 这样在自动加载的时候, 加载器通过类名, 发现这是个插件类, 就会在这个目录下查找.当然, 插件也可以放在任何你想防止的地方, 只要你能把这个类加载进来就可以 

这就是插件的使用过程,对于上面我们做一个总结,用代码来说话。 

首先我们定义好自己的插件类: 
[php] view plaincopy
/**  
* 插件类定义 
* UserPlugin.php 
*/   
class UserPlugin extends Yaf_Plugin_Abstract {   
    //在路由之前触发,这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成   
    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
        echo "Plugin routerStartup called 
\n"; } //路由结束之后触发,此时路由一定正确完成, 否则这个事件不会触发 public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin routerShutdown called
\n"; } //分发循环开始之前被触发 public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin DispatchLoopStartup called
\n"; } //分发之前触发 如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次 public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin PreDispatch called
\n"; } //分发结束之后触发,此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次 public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin postDispatch called
\n"; } //分发循环结束之后触发,此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送 public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin DispatchLoopShutdown called
\n"; } public function preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo "Plugin PreResponse called
\n"; } } 然后注册我们的插件,在上一节中我们讲到过Bootstrap的使用,这回我们要用上它了,就是在Bootstrap注册插件 [php] view plaincopy class Bootstrap extends Yaf_Bootstrap_Abstract{ /** * 注册一个插件 * 插件的目录是在application_directory/plugins */ public function _initPlugin(Yaf_Dispatcher $dispatcher) { $user = new UserPlugin(); $dispatcher->registerPlugin($user); } } 就这样,插件就会在我们的项目运行过程中自动调用相关的Hook,我们可以在这些Hook中部署自己的业务逻辑,比如用户是否需要登录,权限判断等。



推荐阅读
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握Redis集群的应用。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文探讨了哪些数据库支持队列式的写入操作(即一个键对应一个队列,数据可以连续入队),并且具备良好的持久化特性。这类需求通常出现在需要高效处理和存储大量有序数据的场景中。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
author-avatar
kanney姜_958
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有