热门标签 | 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中部署自己的业务逻辑,比如用户是否需要登录,权限判断等。



推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 精选15款免费扁平化界面设计资源
    高质量的网页和移动元素是任何Web或移动项目的基础。优秀的UI设计组件不仅能够提升用户体验,还能显著缩短设计师的工作时间,帮助他们快速创建出引人注目的作品。本文将分享一系列免费的扁平化设计素材。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文详细探讨了如何在Docker环境中实现单机部署Redis集群的方法,提供了详细的步骤和配置示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握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社区 版权所有