前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Yii2 event-如何使用事件

Yii2 event-如何使用事件

原创
作者头像
熬夜的花斑狗
发布2022-01-10 10:25:12
6160
发布2022-01-10 10:25:12
举报
文章被收录于专栏:开发+运维+架构开发+运维+架构

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

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

use Yii;
use yii\base\Behavior;
use yii\base\Application;

/**
 * 事件类
 */
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 api\components;

use Yii;
use yii\base\Model;
use yii\base\Event;

/**
 * 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' => 'api\components\EventService',
    '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:\data\www\project\php\yii2\advanced\api\components\EventService.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:\data\www\project\php\yii2\advanced\api\components\EventService.php:50
    in E:\data\www\project\php\yii2\advanced\api\controllers\SiteController.php:84
2020-08-05 14:43:47 [127.0.0.1][-][-][info][application] $_GET = []

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

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

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档