Я прошел через документацию и все статьи на Yii2 events
, найденные с помощью Google. Может ли кто-нибудь предоставить мне хороший пример того, как события могут использоваться в Yii2 и где это может показаться логичным?Как использовать события в yii2?
ответ
Я могу объяснить события на простом примере. Предположим, вы хотите сделать несколько вещей, когда пользователь сначала регистрируется на сайте, например:
- Отправить электронное письмо администратору.
- Создайте уведомление.
- вы называете это.
Вы можете попытаться вызвать несколько методов после успешного сохранения объекта пользователя. Может быть так:
if($model->save()){
$mailObj->sendNewUserMail($model);
$notification->setNotification($model);
}
До сих пор это может показаться прекрасным, но что, если количество требований возрастает со временем? Скажем, 10 вещей должны произойти после регистрации пользователем пользователя? События приходят в такие ситуации.
Основы событий
События состоят из следующего цикла.
- Вы определяете событие. Скажем, новая регистрация пользователя.
- Вы называете это в своей модели. Может быть добавлено постоянное значение в модели
User
. Мне нравитсяconst EVENT_NEW_USER='new_user';
. Это используется для добавления обработчиков и для запуска события. - Вы определяете метод, который должен что-то делать, когда происходит событие. Отправка сообщения электронной почты администратору. Он должен иметь параметр
$event
. Мы называем этот метод обработчиком. - Вы прикрепляете этот обработчик к
model
, используя его метод, называемыйon()
. Вы можете вызывать этот метод много раз, вы хотите - просто вы можете подключить более одного обработчика к одному событию. - Вы запускаете событие, используя
trigger()
.
Обратите внимание, что все упомянутые выше методы являются частью класса Component
. Почти все классы в yii2 унаследованы от этого класса. Да ActiveRecord
тоже.
Давайте код
Для решения выше указанной проблемы мы можем иметь User.php
модель. Я не буду писать весь код здесь.
// in User.php i've declared constant that stores event name
const EVENT_NEW_USER = 'new-user';
// say, whenever new user registers, below method will send an email.
public function sendMail($event){
echo 'mail sent to admin';
// you code
}
// one more hanlder.
public function notification($event){
echo 'notification created';
}
Следует помнить, что вы не обязаны создавать методы в классе, который создает событие. Вы можете добавить любой статический, не статический метод из любого класса.
Мне нужно прикрепить вышеуказанные обработчики к событию. Основной способ, который я сделал, - использовать метод AR init()
. Итак, вот так:
// this should be inside User.php class.
public function init(){
$this->on(self::EVENT_NEW_USER, [$this, 'sendMail']);
$this->on(self::EVENT_NEW_USER, [$this, 'notification']);
// first parameter is the name of the event and second is the handler.
// For handlers I use methods sendMail and notification
// from $this class.
}
Последняя задача - вызвать событие.Теперь вам не нужно явно вызывать все необходимые методы, как мы это делали раньше. Вы можете заменить его следующим:
if($model->save()){
$model->trigger(User::EVENT_NEW_USER);
}
Все обработчики будут автоматически вызваны.
Очень хороший и тщательный пример там, мне очень помог. Могу ли я использовать этот тип реализации для wordpress, например, для разработки плагинов? Если это так, вы можете проиллюстрировать, как показано выше. –
@nirajanpoudel извините, я не парень Wordpress. –
Это очень помогло. если я хочу подключиться к глобальному $ app, где я определяю обработчики событий, как в вашем ответе, вы определили его в init() модели пользователя? – user1502826
Для "глобальных" событий.
При желании вы можете создать специализированный класс событий
namespace your\handler\Event\Namespace;
class EventUser extends Event {
const EVENT_NEW_USER = 'new-user';
}
определить по крайней мере один класс обработчика:
namespace your\handler\Event\Namespace;
class handlerClass{
// public AND static
public static function handleNewUser(EventUser $event)
{
// $event->user contain the "input" object
echo 'mail sent to admin for'. $event->user->username;
}
}
Внутри составной части конфигурации под (в данном случае) Гильза пользователя вы:
'components' => [
'user' => [
...
'on new-user' => ['your\handler\Event\Namespace\handlerClass', 'handleNewUser'],
],
...
]
Тогда в вашем коде вы можете активировать событие:
Yii::$app->user->trigger(EventUser::EVENT_NEW_USER, new EventUser($user));
ADD
Вы также можете использовать замыкание:
- позволяет IDE для "обнаружить" использование функции (для навигации по коду)
- положить некоторые (маленький), которые управляют событием
пример:
'components' => [
'user' => [
...
'on new-user' => function($param){ your\handler\Event\Namespace\handlerClass::handleNewUser($param);},
'on increment' => function($param){ \Yii::$app->count += $param->value;},
],
...
]
По умолчанию Yii2 уже обеспечивают некоторую декларацию событий, Вы можете прочитать больше о объяснении на BaseActiveRecord.
Вы можете использовать эту переменную так же, как декларировать ее вручную.
public function init()
{
parent::init();
$this->on(self::EVENT_AFTER_INSERT, [$this, 'exampleMethodHere']);
}
- 1. Как регистрировать события в yii2
- 2. Как события работают в Yii2
- 3. , как использовать JavaScript - Yii2
- 4. Как использовать findAll() в yii2?
- 5. Как использовать DbMessageSource в yii2
- 6. Как использовать phpexcel в yii2
- 7. Как использовать mPDF в yii2?
- 8. Как использовать миниатюрное в yii2
- 9. Как использовать CHttpCookie в Yii2
- 10. Как использовать contact_ws в yii2?
- 11. Как использовать CPasswordHelper в yii2
- 12. Как использовать datepicker в yii2?
- 13. Как использовать Swift_Plugins_AntiFloodPlugin в yii2
- 14. Как использовать SoapClient в yii2?
- 15. Как использовать Yii2 Glide
- 16. Yii2: Назначение события яваскрипта на якорь тег в yii2
- 17. Trigger Запланированные События от Yii2
- 18. Как использовать YII2 Sluggable Behavior?
- 19. Yii2 - как правильно использовать generatePasswordHash()?
- 20. Как использовать Yii2 упругую поиска
- 21. Как использовать Yii2 с require.js?
- 22. Как использовать mysqli_info для Yii2
- 23. Как использовать многоязычное поведение Yii2
- 24. Использовать yii2 встроенный в валидаторы
- 25. Как использовать многоязычный язык в yii2?
- 26. Как использовать SASS/SCSS в Yii2?
- 27. Как использовать «onchange» в Yii2 Виджет MaskedInput
- 28. Как использовать внешний API в приложении Yii2?
- 29. Как использовать join и indexBy в Yii2?
- 30. Как использовать javascript в классе модели Yii2?
Может быть, этот пример поможет вам - http://stackoverflow.com/questions/25847013/yii2-multiple-event-attach-on-view –