ralbear/laravel-events-to-sns

Laravel 包,用于将事件推送到 AWS SNS

1.0.2 2021-02-13 13:08 UTC

This package is auto-updated.

Last update: 2024-09-13 20:36:15 UTC


README

Total Downloads Latest Stable Version License

Laravel 事件到 SNS

此库允许我们将 Laravel 事件发送到 SNS 主题,并通过 SQS 队列接收。

安装

$ composer require ralbear/laravel-events-to-sns

将提供者添加到 config/app.php

'providers' => [
    Ralbear\EventsToSns\EventsToSnsProvider::class
 ]

配置

第一步是在 config/queue.php 中创建新的连接配置

'connections' => [
    'sqs-sns' => [
        'driver' => 'sqs-sns',
        'key' => env('SQS_SNS_ACCESS_KEY_ID') ?? env('AWS_ACCESS_KEY_ID') ?? '',
        'secret' => env('SQS_SNS_SECRET_ACCESS_KEY') ?? env('AWS_SECRET_ACCESS_KEY') ?? '',
        'region' => env('SQS_SNS_DEFAULT_REGION') ?? env('AWS_DEFAULT_REGION') ?? '',
        'base_ARN' => env('SQS_SNS_BASE_ARN') ?? '',
        'valid_topics' => explode(',',env('SQS_SNS_VALID_TOPICS')) ?? [],
        'prefix' => env('SQS_SNS_PREFIX') ?? env('SQS_PREFIX') ?? '',
        'queue' => env('SQS_SNS_QUEUE') ?? env('SQS_QUEUE') ?? '',
        'env_postfix' => env('SQS_SNS_ENV') ?? env('APP_ENV') ?? '',
        'event_class_postfix' => 'Event'
    ],
]

AWS 凭据

如果我们使用与 SNS 相同的 AWS 账户来处理应用中的其他 AWS 服务,我们可以使用默认的 env 键来获取凭据。

AWS_ACCESS_KEY_ID=<MAIN ACCESS KEY ID>
AWS_SECRET_ACCESS_KEY=<SECRECT ACCESS KEY>
AWS_DEFAULT_REGION=us-west-1

如果我们需要为 SNS 特定凭据,使用以下 env 键

SQS_SNS_ACCESS_KEY_ID=<SNS ACCESS KEY ID>
SQS_SNS_SECRET_ACCESS_KEY=<SNS SECRET ACCESS KEY>
SQS_SNS_DEFAULT_REGION=eu-west-1

主题

根据设计,此库基于三个部分定义 SNS 主题。

  • A: 使用环境变量
SQS_SNS_BASE_ARN=arn:aws:sns:eu-west-1:123456789
  • B: 在您的事件中定义
public function getTopic()
{
   return 'service-a-topic';
}

我们使用的事件级别主题,应在此环境变量中以逗号分隔的值定义

SQS_SNS_VALID_TOPICS=service-a-topic,service-b-topic
  • D: 如果需要不同于 APP_ENV 的值,使用环境变量
SQS_SNS_ENV=local

SQS_SNS_ENV 允许我们为每个环境自定义主题,例如,如果我们为测试特定功能生成新的环境,我们可以在其中设置功能名称。

示例

事件示例

<?php

namespace App\Events;

use App\Models\Order;
use Ralbear\EventsToSns\Contracts\ShouldBeInSns;
use Ralbear\EventsToSns\Traits\SendToSns;

class OrderCreatedEvent implements ShouldBeInSns
{
    use SendToSns;

    public $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    public function uniqueId()
    {
        return $this->order->id;
    }

    public function getTopic()
    {
        return 'service-a-topic';
    }
}

运行工作进程

运行工作进程

$ php artisan queue:worker sqs-sns

作业示例

<?php

namespace App\Jobs;

use Illuminate\Queue\Jobs\SqsJob;

class OrderCreatedJob
{
    public function handle(SqsJob $job, $data)
    {
        //Do something nice with your $data
        
        $job->delete();
    }
}

测试

运行测试

$ composer test

待办事项

  • 改进测试和覆盖率

许可证

Laravel 事件到 SNS 是开源软件,许可协议为 MIT 许可证