Yii 中優雅的使用事件

guanguans發表於2020-12-08

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

相關文章