rainlab/notify-plugin
Composer 安装命令:
composer require rainlab/notify-plugin
包简介
Notify plugin for October CMS
关键字:
README 文档
README
Plugin is currently in Beta status. Proceed with caution.
Adds support for sending notifications across a variety of different channels, including mail, SMS and Slack.
Notifications are managed in the back-end area by navigating to Settings > Notification rules.
Notification workflow
When a notification fires, it uses the following workflow:
- Plugin registers associated actions, conditions and events using
registerNotificationRules - A notification class is bound to a system event using
Notifier::bindEvent - A system event is fired
Event::fire - The parameters of the event are captured, along with any global context parameters
- A command is pushed on the queue to process the notification
Queue::push - The command finds all notification rules using the notification class and triggers them
- The notification conditions are checked and only proceed if met
- The notification actions are triggered
Here is an example of a plugin registering notification rules. The groups definition will create containers that are used to better organise events. The presets definition specifies notification rules defined by the system.
public function registerNotificationRules() { return [ 'events' => [ \RainLab\User\NotifyRules\UserActivatedEvent::class, ], 'actions' => [ \RainLab\User\NotifyRules\SaveToDatabaseAction::class, ], 'conditions' => [ \RainLab\User\NotifyRules\UserAttributeCondition::class ], 'groups' => [ 'user' => [ 'label' => 'User', 'icon' => 'icon-user' ], ], 'presets' => '$/rainlab/user/config/notify_presets.yaml', ]; }
Here is an example of triggering a notification. The system event rainlab.user.activate is bound to the UserActivatedEvent class.
// Bind to a system event \RainLab\Notify\Classes\Notifier::bindEvents([ 'rainlab.user.activate' => \RainLab\User\NotifyRules\UserActivatedEvent::class ]); // Fire the system event Event::fire('rainlab.user.activate', [$this]);
Here is an example of registering context parameters, which are available globally to all notifications.
\RainLab\Notify\Classes\Notifier::instance()->registerCallback(function($manager) { $manager->registerGlobalParams([ 'user' => Auth::getUser() ]); });
Here is an example of an event preset:
# =================================== # Event Presets # =================================== welcome_email: name: Send welcome email to user event: RainLab\User\NotifyRules\UserRegisteredEvent items: - action: RainLab\Notify\NotifyRules\SendMailTemplateAction mail_template: rainlab.user::mail.welcome send_to_mode: user conditions: - condition: RainLab\Notify\NotifyRules\ExecutionContextCondition subcondition: environment operator: is value: dev condition_text: Application environment <span class="operator">is</span> dev
Creating Event classes
An event class is responsible for preparing the parameters passed to the conditions and actions. The static method makeParamsFromEvent will take the arguments provided by the system event and convert them in to parameters.
class UserActivatedEvent extends \RainLab\Notify\Classes\EventBase { /** * @var array Local conditions supported by this event. */ public $conditions = [ \RainLab\User\NotifyRules\UserAttributeCondition::class ]; /** * Returns information about this event, including name and description. */ public function eventDetails() { return [ 'name' => 'Activated', 'description' => 'A user is activated', 'group' => 'user' ]; } /** * Defines the usable parameters provided by this class. */ public function defineParams() { return [ 'name' => [ 'title' => 'Name', 'label' => 'Name of the user', ], // ... ]; } public static function makeParamsFromEvent(array $args, $eventName = null) { return [ 'user' => array_get($args, 0) ]; } }
Creating Action classes
Action classes define the final step in a notification and subsequently perform the notification itself. Some examples might be sending and email or writing to the database.
class SendMailTemplateAction extends \RainLab\Notify\Classes\ActionBase { /** * Returns information about this event, including name and description. */ public function actionDetails() { return [ 'name' => 'Compose a mail message', 'description' => 'Send a message to a recipient', 'icon' => 'icon-envelope' ]; } /** * Field configuration for the action. */ public function defineFormFields() { return 'fields.yaml'; } public function getText() { $template = $this->host->template_name; return 'Send a message using '.$template; } /** * Triggers this action. * @param array $params * @return void */ public function triggerAction($params) { $email = 'test@email.tld'; $template = $this->host->template_name; Mail::sendTo($email, $template, $params); } }
A form fields definition file is used to provide form fields when the action is established. These values are accessed from condition using the host model via the $this->host property.
# =================================== # Field Definitions # =================================== fields: template_name: label: Template name type: text
An action may choose to provide no form fields by simply returning false from the defineFormFields method.
public function defineFormFields() { return false; }
Creating Condition classes
A condition class should specify how it should appear in the user interface, providing a name, title and summary text. It also must declare an isTrue method for evaluating whether the condition is true or not.
class MyCondition extends \RainLab\Notify\Classes\ConditionBase { /** * Return either ConditionBase::TYPE_ANY or ConditionBase::TYPE_LOCAL */ public function getConditionType() { // If the condition should appear for all events return ConditionBase::TYPE_ANY; // If the condition should appear only for some events return ConditionBase::TYPE_LOCAL; } /** * Field configuration for the condition. */ public function defineFormFields() { return 'fields.yaml'; } public function getName() { return 'My condition is checked'; } public function getTitle() { return 'My condition'; } public function getText() { $value = $this->host->mycondition; return 'My condition <span class="operator">is</span> '.$value; } /** * Checks whether the condition is TRUE for specified parameters * @param array $params * @return bool */ public function isTrue(&$params) { return true; } }
A form fields definition file is used to provide form fields when the condition is established. These values are accessed from condition using the host model via the $this->host property.
# =================================== # Field Definitions # =================================== fields: mycondition: label: My condition type: dropdown options: true: True false: False
Model attribute condition classes
Model attribute conditions are designed specially for applying conditions to sets of model attributes.
class UserAttributeCondition extends \RainLab\Notify\Classes\ModelAttributesConditionBase { protected $modelClass = \RainLab\User\Models\User::class; public function getGroupingTitle() { return 'User attribute'; } public function getTitle() { return 'User attribute'; } /** * Checks whether the condition is TRUE for specified parameters * @param array $params Specifies a list of parameters as an associative array. * @return bool */ public function isTrue(&$params) { $hostObj = $this->host; $attribute = $hostObj->subcondition; if (!$user = array_get($params, 'user')) { throw new ApplicationException('Error evaluating the user attribute condition: the user object is not found in the condition parameters.'); } return parent::evalIsTrue($user); } }
An attributes definition file is used to specify which attributes should be included in the condition.
# =================================== # Condition Attribute Definitions # =================================== attributes: name: label: Name email: label: Email address country: label: Country type: relation relation: model: RainLab\Location\Models\Country label: Name nameFrom: name keyFrom: id
Save to database action
There is a dedicated table in the database for storing events and their parameters. This table is accessed using the RainLab\Notify\Models\Notification model and can be referenced as a relation from your own models. In this example the MyProject model contains its own notification channel called notifications.
class MyProject extends Model { // ... public $morphMany = [ 'my_notifications' => [ \RainLab\Notify\Models\Notification::class, 'name' => 'notifiable' ] ]; }
This channel should be registered with the RainLab\Notify\NotifyRules\SaveDatabaseAction so it appears as a related object when selecting the action.
SaveDatabaseAction::extend(function ($action) { $action->addTableDefinition([ 'label' => 'Project activity', 'class' => MyProject::class, 'relation' => 'my_notifications', 'param' => 'project' ]); });
The label is shown as the related object, the class references the model class, the relation refers to the relation name. The param defines the parameter name, passed to the triggering event.
So essentially if you pass a project to the event parameters, or if project is a global parameter, a notification model is created with the parameters stored in the data attribute. Equivalent to the following code:
$myproject->my_notifications()->create([ // ... 'data' => $params ]);
Dynamically adding conditions to events
Events can be extended to include new local conditions. Simply add the condition class to the event $conditions array property.
UserActivatedEvent::extend(function($event) { $event->conditions[] = \RainLab\UserPlus\NotifyRules\UserLocationAttributeCondition::class; });
rainlab/notify-plugin 适用场景与选型建议
rainlab/notify-plugin 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.9k 次下载、GitHub Stars 达 27, 最近一次更新时间为 2019 年 02 月 13 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「pages」 「october」 「octobercms」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 rainlab/notify-plugin 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 rainlab/notify-plugin 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 rainlab/notify-plugin 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
User plugin for October CMS
Laravel Horizon integration for October CMS
Maintenance page plugin
The "View Counter" bundle
Location plugin for October CMS
Adjacency List’ed Closure Table database design pattern implementation for Laravel. Includes restore of tree
统计信息
- 总下载量: 2.9k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 27
- 点击次数: 6
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-02-13