События Yii обеспечивают простую реализацию, которая позволяет прослушивать и подписываться на различные события, происходящие в вашем веб-приложении. Например, вы можете отправить уведомление о новой статье подписчикам при каждой публикации нового материала.
1 Создайте новое приложение с помощью composer, как описано в официальном руководстве по http://www.yiiframework.com/doc-2.0/guide-start-installation.html. (от переводчика по русски http://yiiframework.domain-na.me/doc/guide/2.0/ru/start-installation )
2 Выполните следующий код SQL на сервере, чтобы создать таблицу статей:
CREATE TABLE 'article' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'name' varchar(255) DEFAULT NULL,
'description' text,
PRIMARY KEY ('id')
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
3 Создайте модель Article с помощью Gii.
4 Запустите ваш webserver командой ./yii serve.
1 Добавить тест действия в \controllers\SiteController:
public function actionTest()
{
$article = new Article();
$article->name = ‘День Святого Валентина приближается? Вот дерьмо! Я забыл снова завести девушку!';
$article->description = ‘Бендер злится на Фрая за то, что он встречается с роботом. Держись подальше от наших женщин. У тебя металлическая лихорадка, парень. Лихорадка металла';
// $event - объект класса yii\base\Event или дочернего класса
$article->on(ActiveRecord::EVENT_AFTER_INSERT, function($event) {
$followers = ['[email protected]',
'[email protected]',
'[email protected]'
];
foreach($followers as $follower) {
Yii::$app->mailer->compose()
->setFrom('[email protected]')
->setTo($follower)
->setSubject($event->sender ->name)
->setTextBody($event->sender->description)
->send();
}
echo 'Emails has been sent';
});
if (!$article->save()) {
echo VarDumper::dumpAsString($article->getErrors());
};
}
2 Обновите config/web.php, компонент mailer использует следующий код.
'mailer' => [
'class' => 'yii\swiftmailer\Mailer', 'useFileTransport' => false,
],
3 Запустите это URL в вашем браузере: http: //localhost: 8080/index . php?r=site/test.
4 Проверьте http://www.fakemailgenerator.com/inbox/teleworm.us/john2/.
Мы создали модель статьи и добавили обработчик для события ActiveRecord: : EVENT_AFTER_INSERT в нашу модель статьи. Это означает, что каждый раз, когда мы сохраняем новую статью, событие инициируется, и наш прикрепленный обработчик будет вызван. В реальном мире, мы хотели бы уведомить наших подписчиков блога каждый раз, когда мы публикуем новую статью. В реальном приложении у нас будет Таблица подписчиков или пользователей и с различными разделами блога, а не только один блог. В этом примере после сохранения нашей модели мы уведомляем наших последователей john2@teleworm. us, shivawhite@cuvox. de, and kate@dayrep. com. На последнем шаге мы просто доказываем, что пользователи получили наши уведомления, особенно john2. Вы можете создать собственное мероприятие с любым именем. В этом примере мы используем встроенное событие ActiveRecord:: EVENT_AFTER_INSERT, которое вызывается после каждой вставки в базу данных. Например, мы можем создать ваше собственное событие. Просто добавьте новое событие TestNew со следующим кодом:
public function actionTestNew()
{
$article = new Article();
$article->name = 'Valentine\'s Day\'s coming? Aw crap! I forgot to get a girlfriend again!';
$article->description = 'Bender is angry at Fry for dating a robot. Stay away from our women. You've got metal fever, boy. Metal fever';
// $event is an object of yii\base\Event or a child class
$article->on(Article::EVENT_OUR_CUSTOM_EVENT, function($event) {
$followers = ['[email protected]',
'[email protected]',
'[email protected]' ];
foreach($followers as $follower) {
Yii::$app->mailer->compose()
->setFrom('[email protected]')
->setTo($follower)
->setSubject($event->sender->name)
->setTextBody($event->sender->description)
->send();
}
echo 'Emails have been sent';
});
if ($article->save()) {
$article->trigger(Article::EVENT_OUR_CUSTOM_EVENT);
}
}
Также добавьте константу EVENT_OUR_CUSTOM_EVENT В models/Article :
class Article extends \yii\db\ActiveRecord {
CONST EVENT_OUR_CUSTOM_EVENT = 'eventOurCustomEvent';
}
Запустите http: //localhost:8080/index.php?r=site/test-new. Вы должны увидеть тот же результат, и все уведомления последователям будут отправлены снова. Главное отличие в том, что мы использовали наше пользовательское имя события. После сохранения мы запустили наше событие. События могут быть вызваны вызовом триггером yii\base\Component::trigger(). Метод требует имя события и при необходимости объект события, описывающий параметры, которые должны быть переданы обработчикам событий.
Для получения дополнительной информации о событиях обратитесь к http://www.yiiframework.com/doc-2.0/guide-concept-events.html по русски http://yiiframework.domain-na.me/doc/guide/2.0/ru/concept-events