superbalist/laravel4-event-pubsub

此包已被弃用且不再维护。未建议替代包。

为 Laravel 4 设计的事件协议和 pub/sub 实现

3.0.2 2017-11-13 08:39 UTC

README

为 Laravel 4 设计的事件协议和 pub/sub 实现。

Author Build Status StyleCI Software License Packagist Version Total Downloads

此包是连接 php-event-pubsub 到 Laravel 的封装器。它基于现有的 laravel4-pubsub 包,增加了通过 pub/sub 发布和订阅事件的功能。

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

对于 Laravel 5 支持,使用包 https://github.com/Superbalist/laravel-event-pubsub

安装

composer require superbalist/laravel4-event-pubsub

该包内置了默认配置。

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

php artisan config:publish superbalist/laravel4-event-pubsub

然后您可以在 app/config/packages/superbalist/laravel4-event-pubsub/config.php 中编辑生成的配置。

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

'providers' => [
    // ...
    'Superbalist\Laravel4EventPubSub\PubSubEventsServiceProvider',
]

在 app.php 中注册外观

'aliases' => [
    // ...
    'PubSubEvents' => 'Superbalist\Laravel4EventPubSub\PubSubEventsFacade',
]

使用方法

简单事件

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 事件。

您可以监听以下事件来连接这些

$events = app('events'); // or just use the facade Events

$events->listen('pubsub.events.translation_failure', function ($message) {
    // the message failed to translate into an event
});

$events->listen('pubsub.events.listen_expr_failure', function (\Superbalist\EventPubSub\EventInterface $event, $expr) {
    // the event didn't match the listen expression
    // this isn't really an error, but can be useful for debug
});

$events->listen('pubsub.events.validation_failure', function (\Superbalist\EventPubSub\ValidationResult $result) {
    // the event failed validation
    var_dump($result->errors());
});