vitalik74 / event-app
Yii 2 基础事件应用程序
dev-master
2016-04-29 05:23 UTC
Requires
- php: >=5.4.0
- codeception/codeception: 2.0.*
- codeception/specify: *
- codeception/verify: *
- yiisoft/yii2: >=2.0.5
- yiisoft/yii2-bootstrap: *
- yiisoft/yii2-codeception: *
- yiisoft/yii2-debug: *
- yiisoft/yii2-faker: *
- yiisoft/yii2-gii: *
- yiisoft/yii2-swiftmailer: *
This package is not auto-updated.
Last update: 2024-09-14 18:36:59 UTC
README
花费了大约 28 个小时的时间。欢迎提出意见和错误。请发送至 tsibikov_vit@mail.ru。已测试在 php 5.5,mysql 5.6 上。
安装
-
php composer.phar create-project --prefer-dist --stability=dev vitalik74/event-app basic -
在配置中指定数据库
-
执行
yii migrate --migrationPath=@yii/rbac/migrations -
执行
yii migrate -
执行
yii rbac/init -
admin 123456 登录/密码在管理后台。
结构
负责所有事件的主要类是 app/components/events/Event。作为组件连接到 Yii。具有一系列配置。如果配置中缺少某些必需参数,则将抛出 InvalidConfigException 异常,表示配置不正确。配置示例
'event' => [
'class' => 'app\components\events\Event', // сам класс
'modelsNamespace' => [ // какие модели мы подключаем к системе ивентов
'app\models',
//'app\controllers'
],
'eventsNamespace' => 'app\events', // неймспейс классов отправки самих уведомлений
'findModelsRecursive' => false, // искать ли в подпапках классы
'startCustomEventName' => 'EVENT_CUSTOM', // начальное название констант, которые означают какое-то событие
'executeModels' => [ // не учитываем эти модели, поддерживается формат 'model' => ['constant', 'constant'].
'app\models\Article' => [
'EVENT_CUSTOM_SEND_USERS_OFF', 'EVENT_CUSTOM_SEND_USERS_OFF2'
],
'app\models\Event', 'app\models\BrowserEvent',
],
'modelEventClass' => 'app\models\Event',// модель текста событий из БД. Должна реализовывать интерфейс EventModelInterface
]
发送通知的类(如 Email、Browser 等)位于 app/events。将其分离出来以降低关联性。它们继承自 BaseSender 并实现 SenderInterface 接口。
AR 模型 Event 必须实现 EventModelInterface 接口。
功能
存在 4 种连接事件的方式(在连接之前需要声明事件常量,其初始名称如配置中所示(默认为 EVENT_CUSTOM))
/**
* @return \app\components\events\Event
*/
protected function getEvent()
{
/** @var \app\components\events\Event $event */
return Yii::$app->event;
}
/**
* @inheritdoc
*/
public function init()
{
$event = $this->getEvent();
$event->bind($this);// bind default events
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_WITH_PARAM, ['where' => ['user_id' => 1]]);
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_WITH_MODELS, ['models' => ['user']]);
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_CLOSURE, function () {
return [
'test' => 'Test variable',
];
});
parent::init();
}
- 最简单的方式是连接到默认事件(在
Model、Component、ActiveRecord中声明),此时将传递整个模型给发送器,并在文本中将变量替换为相应的值。
$event->bind($this);// bind default events
- 与上述类似,但事件仅在满足条件时才会触发。例如,需要特定状态时。在管理后台添加事件时,将自动提示选择哪些默认事件要触发。
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_WITH_PARAM, ['where' => ['user_id' => 1]]);
实际上这代替了以下代码
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if ($this->type == 1) {
$this->trigger(...);
}
}
- 当发送的消息需要包含多个关联模型的数据时。例如:发布了一篇新文章,需要指明作者。选择此类事件时,在事件管理器中将自动加载相关模型并显示所有可能的属性。
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_WITH_MODELS, ['models' => ['user']]);
- 最后一种方式是,当需要自由操作时,则使用匿名函数。匿名函数应返回一个包含变量的数组。这些变量将扩展到消息中。
$event->bind($this, static::EVENT_CUSTOM_SEND_USERS_CLOSURE, function () {
return [
'test' => 'Test variable',
];
});