Yaf学习笔记之钩子与插件

本文介绍了Yaf框架中的钩子(Hook)机制,包括六个预定义的钩子,以及如何创建和注册插件。通过一个具体的TracePlugin插件示例,详细讲解了如何定义与钩子同名的方法,并接收必要参数。最后展示了如何在IndexController中测试插件,证实了钩子的触发和视图渲染效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Yaf中定义了6个钩子(Hook),相当于事件,在插件(Plugin)类中定义与钩子相同名称的方法,注册之后,这些方法便会被框架自动调用。

一、钩子列表

触发顺序名称触发时机说明
1routerStartup路由之前触发最早的一个事件
2routerShutdown路由结束之后
3dispatchLoopStartup分发循环开始前
4preDispatch分发之前如果勤求处理过程中发送了forward,则该事件可能触发多次
5postDispatch分发之后动作执行结束,视图渲染完成,也可能触发多次
6dispatchLoopShutdown分发循环结束所有业务逻辑已经完成,响应还未发送

二、插件

  • 插件类的默认目录默认为plugins
  • 插件类必须继承自Yaf_Plugin_Abstract
  • 插件类中定义的与Yaf 钩子相同名称的方法,要接受Yaf_Request_Abstract实例和Yaf_Response_Abstract实例,作为参数,否则会报错。

写个例子来加深理解:

1. 定义插件

定义一个TracePlugin插件,其中定义Yaf框架中的6个Hook同名方法。

<?php

class TracePlugin extends Yaf_Plugin_Abstract
{
    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }

    public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }

    public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }

    public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }

    public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...<br/>";
    }
}

以上代码保存为 application/plugins/Trace.php。

2. 注册插件

$app->run();之前注册插件:

$app->getDispatcher()->registerPlugin(new TracePlugin);
3.测试插件

IndexController内容如下:

<?php

class IndexController extends Yaf_Controller_Abstract
{
    public function indexAction()
    {
        $this->getView()->assign("content", "Hello World");
        $this->forward('user');
    }

    public function userAction()
    {
        $this->getView()->assign("content", "action user");
    }
}

以上代码保存为application/controllers/Index.php。

为了测试多次触发preDispatchpostDispatchindexActionforward到了userAction

浏览器中访问yaf.cc/index/index:
这里写图片描述

由上图可见,preDispatchpostDispatch确实被触发了两次,同时两个action中的视图都渲染出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值