Yii2 event-如何使用事件

2022-01-10 10:25:09 浏览数 (2)

这里说的是通过行为的方式绑定事件

  • 定义行为事件类:EventService.php
代码语言:javascript复制
<?php
namespace apicomponents;

use Yii;
use yiibaseBehavior;
use yiibaseApplication;

/**
 * 事件类
 */
class EventService extends Behavior
{
    // 定义事件名
    const EVENT_BEFORE_DEMO1 = 'beforeDemo1';

    /**
     * [ 事件绑定处理程序 ]
     * @return [type] [description]
     */
    public function events()
    {
        return [
            Application::EVENT_BEFORE_REQUEST => 'demo',
            self::EVENT_BEFORE_DEMO1 => 'demo1',
        ];
    }

    /**
     * [ 事件测试 ]
     * @param  [type] $event [description]
     * @return [type]        [description]
     */
    public function demo($event)
    {
        Yii::info(['message'=>'事件测试(自动触发)'], 'demo');
    }

    /**
     * [ 事件测试1 ]
     * @param  [type] $event [description]
     * @return [type]        [description]
     */
    public function demo1($event)
    {
        $log = [
            'message' => '事件测试1',
            'ip' => $event->ip,
            'route' => $event->route,
        ];
        Yii::info($log, 'demo1');
    }
}

  • 定义数据格式类:MyEvent.php
代码语言:javascript复制
<?php
namespace apicomponents;

use Yii;
use yiibaseModel;
use yiibaseEvent;

/**
 * ContactForm is the model behind the contact form.
 */
class MyEvent extends Event
{
    /** @var [type] [ 请求路由 ] */
    public $route;

    /** @var [type] [ 请求IP ] */
    public $ip;

}

  • 配置自动触发事件
代码语言:javascript复制
在config/main.php中components同级定义
    'name' => 'My Api',
    'as behaviors' => 'apicomponentsEventService',
    'components' => [ ... ]

  • 在行为函数中手动触发行为事件
代码语言:javascript复制
    /**
     * [ 首页 ]
     * @return [type] [description]
     */
    public function actionIndex()
    {
        $event = new MyEvent();
        // 传递参数
        $event->ip = Yii::$app->request->userIP;
        $event->route = Yii::$app->requestedRoute;

        // 手动触发事件
        Yii::$app->trigger(EventService::EVENT_BEFORE_DEMO1, $event);
    }

  • 查看日志
代码语言:javascript复制
2020-08-05 14:43:47 [127.0.0.1][-][-][info][demo] [
    'message' => '事件测试(自动触发)',
]
    in E:datawwwprojectphpyii2advancedapicomponentsEventService.php:35
2020-08-05 14:43:47 [127.0.0.1][-][-][info][demo1] [
    'message' => '事件测试1',
    'ip' => '127.0.0.1',
    'route' => 'site/index',
]
    in E:datawwwprojectphpyii2advancedapicomponentsEventService.php:50
    in E:datawwwprojectphpyii2advancedapicontrollersSiteController.php:84
2020-08-05 14:43:47 [127.0.0.1][-][-][info][application] $_GET = []

Yii2 事件的使用就是这么简单,利用事件可以帮助我们完成很多功能。

const EVENT_BEFORE_REQUEST = 'beforeRequest',这个是yiibaseApplication自带的事件,意思是"事件在应用程序开始处理请求之前引发的事件"。

有请求前的就肯定有请求后的事件。const EVENT_AFTER_REQUEST = 'afterRequest',意思是"事件在应用程序成功处理请求之后(在发出响应之前)引发的事件。"。

自定义的事件需要在特定需要的时候去触发。Yii::$app->trigger('定义事件名', 实例化event的类,可以传递参数,可以不传递)

以上就是对Yii2框架事件使用方法分享,各位大牛要是有更好的方法也请分享一下。

0 人点赞