Yii事件

可以在特定執行點注入自定義代碼使用事件。事件可自定義代碼,當事件被觸發時該代碼被執行。例如,當一個新的用戶在網站上註冊,一個日誌記錄器(logger)對象可能會引發 userRegistered 事件。

如果一個類需要觸發事件,則應該擴展 yii\base\Component 類。

事件處理程序是一個 PHP 回調。您可以使用下面的回調 -

  • 指定爲字符串的全局PHP函數

  • 一個匿名函數

  • 一個類名的數組和方法作爲字符串,例如, ['ClassName', 'methodName']

  • 一個對象的數組和一個方法作爲字符串,例如 [$obj, 'methodName']

第1步 - 要將處理程序綁定到一個事件,應該調用 yii\base\Component::on() 方法

$obj = new Obj;
// this handler is a global function
$obj->on(Obj::EVENT_HELLO, 'function_name');
// this handler is an object method
$obj->on(Obj::EVENT_HELLO, [$object, 'methodName']);
// this handler is a static class method
$obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
// this handler is an anonymous function

$obj->on(Obj::EVENT_HELLO, function ($event) {
// event handling logic
});

可以將一個或多個處理程序到附加事件。附加處理程序將會按它們在附連到該事件的順序來調用。

第2步 - 要停止在處理程序的調用,應該將 yii\base\Event::$handled 屬性設置爲 true。

$obj->on(Obj::EVENT_HELLO, function ($event) {
$event->handled = true;
});

第3步 - 要插入處理程序到隊列開始,可以調用 yii\base\Component::on() ,傳遞第四個參數的值爲 false 。

$obj->on(Obj::EVENT_HELLO, function ($event) {
// ...
}, $data, false);

第4步 - 觸發一個事件,調用 yii\base\Component::trigger() 方法。

namespace app\components;
use yii\base\Component;
use yii\base\Event;
class Obj extends Component {
const EVENT_HELLO = 'hello';
public function triggerEvent() {
$this->trigger(self::EVENT_HELLO);
}
}

第5步 - 要將事件附加一個處理程序,應該調用 yii\base\Component::off() 方法。

$obj = new Obj;
// this handler is a global function
$obj->off(Obj::EVENT_HELLO, 'function_name');
// this handler is an object method
$obj->off(Obj::EVENT_HELLO, [$object, 'methodName']);
// this handler is a static class method
$obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
// this handler is an anonymous function

$obj->off(Obj::EVENT_HELLO, function ($event) {
// event handling logic
});