superbalist/laravel-event-pubsub

此包已被废弃,不再维护。未建议替代包。

Laravel 的基于 pub/sub 的事件协议和实现

3.0.1 2017-07-25 13:37 UTC

This package is auto-updated.

Last update: 2024-08-04 17:49:31 UTC


README

Laravel 的基于 pub/sub 的事件协议和实现。

Author Build Status StyleCI Software License Packagist Version Total Downloads

此包是一个桥接器,将 php-event-pubsub 包装到 Laravel 中。它基于现有的 laravel-pubsub 包,增加了通过 pub/sub 发布和订阅事件的支持。

如果你不熟悉 laravel-pubsub 包,建议首先查看他们的 文档

为了支持 Laravel 4,请使用包 https://github.com/Superbalist/laravel4-event-pubsub

安装

composer require superbalist/laravel-event-pubsub

该包有一个默认配置,使用以下环境变量。

PUBSUB_EVENTS_CONNECTION=null
PUBSUB_EVENTS_TRANSLATOR=pubsub.events.translators.simple
PUBSUB_EVENTS_VALIDATOR=null
PUBSUB_EVENTS_THROW_VALIDATION_EXCEPTIONS_ON_DISPATCH=true

如果 PUBSUB_EVENTS_CONNECTION 环境变量或 pubsub_events.default 配置值留空,则默认连接将从 laravel-pubsub 包配置中获取。

在 app.php 中注册服务提供者

'providers' => [
    // ...
    Superbalist\LaravelEventPubSub\PubSubEventsServiceProvider::class,
]

在 app.php 中注册外观

'aliases' => [
    // ...
    'PubSubEvents' => Superbalist\LaravelEventPubSub\PubSubEventsFacade::class,
]

要自定义配置文件,请使用 Artisan 发布包配置。

php artisan vendor:publish --provider="Superbalist\LaravelEventPubSub\PubSubEventsServiceProvider"

然后您可以在 app/config/pubsub_events.php 中编辑生成的配置。

使用方法

简单事件

SimpleEvent 是一个接受名称和可选属性的事件的简单事件。

// the pubsub_events.translator config setting should be set to 'pubsub.events.translators.simple'

// get the event manager
$manager = app('pubsub.events');

// dispatch an event
$event = new \Superbalist\EventPubSub\Events\SimpleEvent(
    'user.created',
    [
        'user' => [
            'id' => 1456,
            'first_name' => 'Joe',
            'last_name' => 'Soap',
            'email' => 'joe.soap@example.org',
        ],
    ]
);
$manager->dispatch('events', $event);

// dispatch multiple events
$events = [
    new \Superbalist\EventPubSub\Events\SimpleEvent(
        'user.created',
        [
            'user' => [
                // ...
            ],
        ]
    ),
    new \Superbalist\EventPubSub\Events\SimpleEvent(
        'user.created',
        [
            'user' => [
                // ...
            ],
        ]
    ),
];
$manager->dispatchBatch('events', $events);

// listen for an event
$manager->listen('events', 'user.created', function (\Superbalist\EventPubSub\EventInterface $event) {
    var_dump($event->getName());
    var_dump($event->getAttribute('user'));
});

// listen for all events on the channel
$manager->listen('events', '*', function (\Superbalist\EventPubSub\EventInterface $event) {
    var_dump($event->getName());
});

// all the aboce commands can also be done using the facade
PubSubEvents::dispatch('events', $event);

主题事件

TopicEvent 是一个接受主题、名称、版本和可选属性的事件的简单事件。

// the pubsub_events.translator config setting should be set to 'pubsub.events.translators.topic'

// get the event manager
$manager = app('pubsub.events');

// dispatch an event
$event = new \Superbalist\EventPubSub\Events\TopicEvent(
    'user',
    'created',
    '1.0',
    [
        'user' => [
            'id' => 1456,
            'first_name' => 'Joe',
            'last_name' => 'Soap',
            'email' => 'joe.soap@example.org',
        ],
    ]
);
$manager->dispatch('events', $event);


// listen for an event on a topic
$manager->listen('events', 'user/created', function (\Superbalist\EventPubSub\EventInterface $event) {
    // ...
});

// listen for an event on a topic matching the given version
$manager->listen('events', 'user/created/1.0', function (\Superbalist\EventPubSub\EventInterface $event) {
    // ...
});

// listen for all events on a topic
$manager->listen('events', 'user/*', function (\Superbalist\EventPubSub\EventInterface $event) {
    // ...
});

// listen for all events on the channel
$manager->listen('events', '*', function (\Superbalist\EventPubSub\EventInterface $event) {
    // ...
});

模式事件

SchemaEventTopicEvent 的扩展,并接受模式和可选属性。主题、名称和版本是从模式中派生出来的。

模式必须采用以下格式 (协议)://(......)?/events/(主题)/(通道)/(版本).json

// the pubsub_events.translator config setting should be set to 'pubsub.events.translators.schema'
// the pubsub_events.validator config setting can be set to 'pubsub.events.validators.json_schema' to take advantage of
// JSON Schema validation on incoming events

// get the event manager
$manager = app('pubsub.events');

// dispatch an event
$event = new \Superbalist\EventPubSub\Events\SchemaEvent(
    'http://schemas.my-website.org/events/user/created/1.0.json',
    [
        'user' => [
            'id' => 1456,
            'first_name' => 'Joe',
            'last_name' => 'Soap',
            'email' => 'joe.soap@example.org',
        ],
    ]
);
$manager->dispatch('events', $event);

// the listen expressions are the same as those used for TopicEvents.

错误处理

该库支持在事件转换失败、监听表达式失败和验证失败时使用错误处理器。

这些可以在 translate_fail_handler、listen_expr_fail_handler 和 validation_fail_handler 配置选项中配置为可调用的。

该配置包含默认的可调用的,这些将回调转换为 Laravel 事件。

您可以在 EventServiceProvider 中注册以下事件的监听器

\Superbalist\LaravelEventPubSub\Events\TranslationFailureEvent(
    $message
)
\Superbalist\LaravelEventPubSub\Events\ListenExprFailureEvent(
    \Superbalist\EventPubSub\EventInterface $event,
    $expr
)
\Superbalist\LaravelEventPubSub\Events\ValidationFailureEvent(
    \Superbalist\EventPubSub\ValidationResult $result
)