chocofamilyme / restapi-model-listener
Phalcon模型监听器
0.1.1
2019-07-31 10:46 UTC
Requires
- php: >= 7.0.0
- chocofamilyme/pubsub: 2.*
Requires (Dev)
This package is auto-updated.
Last update: 2024-08-29 04:49:11 UTC
README
该库允许监听内置模型事件并发送消息到队列。
要求
- Phalcon > 3.0.0
- chocofamilyme/pubsub > 2.*
- RestAPI
安装
使用composer
composer require chocofamilyme/restapi-model-listener
使用
将监听器附加到 Events Manager 以监听Phalcon模型的以下事件:
class ServiceProvider extends AbstractServiceProvider { protected $serviceName = 'eventsManager'; public function register() { $this->di->setShared( $this->serviceName, function () { $eventsManager = new Manager(); $eventsManager->attach('model', new ModelsListener()); return $eventsManager; } ); } }
监听afterCreate
、afterUpdate
、afterDelete
事件。为了监听,模型必须实现HasEvents
接口
接口的getQueueName
方法应该根据事件名称返回队列名称。
示例
class Order extends Model implements HasEvents { const EVENTS = [ 'paid' => 'rahmet.order.paid', 'created' => 'rahmet.order.created', 'updated' => 'rahmet.order.updated' ]; /** * @param string $eventName * @return string */ public function getQueueName(string $eventName) : string { return self::EVENTS[$eventName]; } /** * @param Model $model * @return array */ public function getAttributes(Model $model): array { return [ 'id' => $model->getId(), 'custom' => 'some-custom' ]; } //other logic.. }
默认情况下,payload会发送模型的所有字段。对于选择性发送或添加额外的字段,在模型中实现Chocofamily Pubsub库的SerializerInterface
接口。方法getAttributes
接受模型作为参数,应该返回一个包含要发送到队列的属性的字段数组。
可以创建自定义序列化器并将其注入到监听器中。在这种情况下,该序列化器将适用于所有监听模型
public function register() { $this->di->setShared( $this->serviceName, function () { $serializer = new CustomSerializer(); $listener = new ModelsListener(); $listener->setObjectSerializer($serializer); $eventsManager = new Manager(); $eventsManager->attach('model', $listener); return $eventsManager; } ); }
相应地,该序列化器必须实现SerializerInterface
,或者继承自Chocofamily Pubsub库的基本ObjectSerializer
。