rasuvaeff/yii3-outbox-webhooks-bridge
Composer 安装命令:
composer require rasuvaeff/yii3-outbox-webhooks-bridge
包简介
Bridge between yii3-outbox and yii3-webhooks for durable at-least-once webhook delivery
README 文档
README
Bridges yii3-outbox and yii3-webhooks for durable at-least-once webhook delivery. Each outbox message is converted to a WebhookEvent and dispatched to configured endpoints via an injected WebhookDispatcher.
Using an AI coding assistant? llms.txt has a compact API reference designed for LLMs.
Requirements
- PHP 8.3–8.5
rasuvaeff/yii3-outbox^1.0rasuvaeff/yii3-webhooks^1.0- A
WebhookDispatcherimplementation (e.g. a PSR-18-based adapter in your app) - A
WebhookDeliveryStorageimplementation (e.g.yii3-webhooks-db)
Installation
composer require rasuvaeff/yii3-outbox-webhooks-bridge
Usage
1. Configure endpoints
use Rasuvaeff\Yii3OutboxWebhooksBridge\ConfigWebhookEndpointProvider; use Rasuvaeff\Yii3Webhooks\WebhookEndpoint; $endpointProvider = new ConfigWebhookEndpointProvider(map: [ 'order.created' => [ new WebhookEndpoint(url: 'https://partner-a.example.com/hooks', secret: 'secret-a'), new WebhookEndpoint(url: 'https://partner-b.example.com/hooks', secret: 'secret-b'), ], 'order.paid' => [ new WebhookEndpoint(url: 'https://partner-a.example.com/hooks', secret: 'secret-a'), ], ]);
2. Wire the publisher
use Rasuvaeff\Yii3OutboxWebhooksBridge\OutboxWebhookPublisher; $publisher = new OutboxWebhookPublisher( dispatcher: $dispatcher, // your WebhookDispatcher impl endpointProvider: $endpointProvider, deliveryStorage: $deliveryStorage, // e.g. DbWebhookDeliveryStorage );
3. Run the outbox processor
use Rasuvaeff\Yii3Outbox\Processor; $processor = new Processor( storage: $outboxStorage, publisher: $publisher, clock: $clock, ); // In a background worker or console command: $result = $processor->process(types: ['order.created', 'order.paid']);
Behaviour
| Situation | Result |
|---|---|
Endpoint returns Delivered |
Delivery saved; message marked published |
Endpoint returns Failed |
Delivery saved; PublishException thrown → outbox retries |
| Dispatcher throws | PublishException thrown → outbox retries |
| No endpoints for type | Silent success (zero deliveries, message published) |
| Multiple endpoints, one fails | All dispatched; PublishException thrown → all retried |
Event id dedup
The outbox message id is reused as the WebhookEvent id. On retry, the same id
is sent again. Receivers should use the X-Webhook-Id header (set by
HmacSha256Signer) for idempotency.
Custom endpoint provider
Implement WebhookEndpointProvider to load endpoints from a database, cache, or
any runtime source:
use Rasuvaeff\Yii3OutboxWebhooksBridge\WebhookEndpointProvider; use Rasuvaeff\Yii3Webhooks\WebhookEndpoint; final readonly class DbWebhookEndpointProvider implements WebhookEndpointProvider { public function __construct(private \PDO $db) {} public function getEndpointsForType(string $type): array { // load from DB... } }
Security
- Secrets are never stored in
WebhookDelivery(comes fromyii3-webhooks). - Use
HmacSha256Signer(fromyii3-webhooks) as yourWebhookDispatcher's signer to authenticate outbound requests. - Receivers should validate the signature via
WebhookVerifierand useReplayGuardagainst nonce replay.
Examples
See examples/ for runnable scripts.
Development
docker run --rm -v "$PWD":/app -w /app composer:2 composer build docker run --rm -v "$PWD":/app -w /app composer:2 composer cs:fix docker run --rm -v "$PWD":/app -w /app composer:2 composer test
License
BSD-3-Clause. See LICENSE.md.
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2026-06-19