Yii 中优雅的使用事件

Yii 中使用一个事件大概是这个样子的#

// 绑定事件
$component->on($event::EVENT_NAME, [$object, 'methodNameA']);
$component->on($event::EVENT_NAME, [$object, 'methodNameB']);
// 触发事件
$component->trigger($event::EVENT_NAME, $event); 

从上面代码中可以看出如果要触发一个 5 个监听监听的事件,是要入侵 6 行代码的,这显然是不够优雅的,所以写了个组件包将事件与监听绑定写在组件配置文件,调用的时候只需一行代码去触发事件。

源码#

环境要求#

  • Yii > 2.0

安装#

$ composer require guanguans/yii-event -vvv

配置#

...
'components' => [
    ...
    'event' => [
        'class' => \Guanguans\YiiEvent\Event::className(),
        'listen' => [
            // 事件类名
            \app\events\ExampleEvent::className() => [      
                // 监听该事件监听的类名
                \app\listeners\ExampleListener::class,
            ],
        ],
    ],
    ...
],
...

使用示例#

创建事件 app\events\ExampleEvent.php#

namespace app\events;

use yii\base\Event;

class ExampleEvent extends Event
{
    public $name = 'example';
}

创建监听 app\listeners\ExampleListener.php#

namespace app\listeners;

use Guanguans\YiiEvent\ListenerInterface;
use yii\base\Event;

class ExampleListener implements ListenerInterface
{
    public static function handle(Event $event)
    {
        // to do something.
        var_export($event->name);
    }
}

触发事件#

Yii::$app->event->dispatch(new ExampleEvent());
// or
event(new ExampleEvent());

验证结果#

'example'
本作品采用《CC 协议》,转载必须注明作者和本文链接
No practice, no gain in one's wit. 我的 Gitub
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

请问,如果我有 100 个事件,岂不是要在配置里加 100 条 listen 吗?……

3年前 评论
guanguans (楼主) 3年前

未填写
文章
58
粉丝
131
喜欢
991
收藏
1349
排名:45
访问:15.5 万
私信
所有博文
社区赞助商