Yii - Sự kiện

Bạn có thể dùng eventsđể đưa mã tùy chỉnh vào các điểm thực thi nhất định. Bạn có thể đính kèm mã tùy chỉnh vào một sự kiện và khi sự kiện được kích hoạt, mã sẽ được thực thi. Ví dụ: một đối tượng trình ghi nhật ký có thể kích hoạt mộtuserRegisteredsự kiện khi người dùng mới đăng ký trên trang web của bạn. Nếu một lớp cần kích hoạt các sự kiện, bạn nên mở rộng nó từ lớp yii \ base \ Component.

Một trình xử lý sự kiện là một lệnh gọi lại PHP. Bạn có thể sử dụng các lệnh gọi lại sau:

  • Một hàm PHP toàn cầu được chỉ định dưới dạng một chuỗi.

  • Một chức năng ẩn danh.

  • Một mảng gồm tên lớp và phương thức dưới dạng chuỗi, ví dụ: ['ClassName', 'methodName']

  • Một mảng của một đối tượng và một phương thức dưới dạng một chuỗi, ví dụ: [$ obj, 'methodName']

Step 1 - Để đính kèm một trình xử lý vào một sự kiện, bạn nên gọi yii\base\Component::on() phương pháp.

$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
});

Bạn có thể đính kèm một hoặc nhiều trình xử lý vào một sự kiện. Các trình xử lý đính kèm được gọi theo thứ tự mà chúng được gắn vào sự kiện.

Step 2 - Để dừng việc gọi các trình xử lý, bạn nên đặt yii\base\Event::$handled property đến true.

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

Step 3 - Để chèn trình xử lý vào đầu hàng đợi, bạn có thể gọi yii\base\Component::on(), chuyển false cho tham số thứ tư.

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

Step 4 - Để kích hoạt một sự kiện, hãy gọi yii\base\Component::trigger() phương pháp.

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);
   }
}

Step 5 - Để tách một trình xử lý khỏi một sự kiện, bạn nên gọi yii\base\Component::off() phương pháp.

$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
});