chocofamilyme/restapi-model-listener

Phalcon模型监听器

0.1.1 2019-07-31 10:46 UTC

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;
            }
        );
    }
}

监听afterCreateafterUpdateafterDelete事件。为了监听,模型必须实现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