定制 zipzoft/laravel-message-transporter 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

zipzoft/laravel-message-transporter

Composer 安装命令:

composer require zipzoft/laravel-message-transporter

包简介

Message transporter

README 文档

README

เป็นตัว broadcast ข้อมูลไปยัง service ต่างๆ (แนวคิด microservice)

สิ่งที่ต้องการ

{
  "php": "^7.4|^8.0"
}

ติดตั้ง

composer require zipzoft/laravel-message-transporter

ตั้งค่า

โดยปกติแล้ว env จะมีค่าเริ่มต้นคือ

SERVICE_BROADCASTER_DRIVER=none

Driver

ตอนนี้ใช้ได้แค่ redis นะครับ

SERVICE_BROADCASTER_DRIVER=redis 

การตั้งค่า

นี่คือค่า Default

// /config/message-transporter.php

return [
    'default' => env('SERVICE_BROADCASTER_DRIVER', 'none'),
    'connection_prefix' => 'app-services_',
    'queue' => true,
]

หรือแก้ไขได้เอง โดยรันคำสั่งด้านล่าง

Config จะวางอยุ่ที่ /config/message-transporter.php

php artisan vendor:publish --class="Zipzoft\MessageTransporter\MessageTransporterServiceProvider" --tag="config"

เริ่มใช้งาน

ส่วนของ Producer

ตัวอย่าง config ของ Producer

// /config/database.php

return [
    // ...
    
    'redis' => [
        // ....
        
        'app-services_producer' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => 2,
            'options' => [
                'prefix' => env('SERVICE_BROADCASTER_PREFIX'),
            ]
        ]
    ]
];

ใส่ implementation ไปที่ Event ของท่าน

ซึ่งรูปแบบการใช้งานนั้น ท่านสามารถอ้างอิงได้จากเอกสารของ Laravel ได้เลย

<?php

namespace App\Events;

use App\User;
use Zipzoft\MessageTransporter\ShouldBroadcastAppServices;
use Zipzoft\MessageTransporter\ShouldBroadcastAppServicesNow;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\PrivateChannel;

class UserCreated implements ShouldBroadcastAppServices
{
    // ....
    
    public $user;
    
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    
    public function broadcastOn()
    {
        return [
            new Channel("app"),
            new PrivateChannel("call-center"),
        ];
    }
    
    
    // Supported method
    // broadcastWith, broadcastWhen, broadcastAs
}

โดยปกแล้วจะส่งโดยใช้ Queue เป็นหลัก

หากท่านไม่ต้องการส่งแบบ queue ให้ท่านใช้ ShouldBroadcastAppServicesNow แทนได้เลย

use Zipzoft\MessageTransporter\ShouldBroadcastAppServicesNow;

Format ที่ส่งไปนั้นอยู่ในรูปแบบ JSON

{
  "event" : "App\\Events\\UserCreated",
  "data" : {
    "user" : {
      "id" : "....",
      "name" : "..."
    }
  },
  "sent" : "2021-09-10T15:13:12+07:00"
}

ส่วน Channel name นั้น จะอ่านจาก method broadcastOn เป็นหลัก ดังนั้น ในที่นี้ชื่อจะเป็นตามต้วอย่างด้านล่าง

app
private-call-center

เมื่อรวมกัน prefix ที่ท่านตั้งค่าใน env('SERVICE_BROADCASTER_PREFIX') แล้ว (สมมติ SERVICE_BROADCASTER_PREFIX = 'myweb::') จะได้

myweb::app
myweb::private-call-center

ส่วนของ Consumer

ตัวอย่าง config ของ consumer

// /config/database.php

return [
    // ...
    
    'redis' => [
        // ....
        
        'app-services_consumer' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => 2,
            'options' => [
                'prefix' => '',
            ]
        ]
    ]
];

คุณจำเป็นต้องสร้าง Artisan Command มาก่อนเมื่อเป็นตัวรับข้อมูลตลอดเวลา เช่นในตัวอย่างนี้

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Zipzoft\MessageTransporter\Broadcasters\ServiceBroadcaster;
use Zipzoft\MessageTransporter\Event\OnMessage;

class SubscribeAppServicesCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'service:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe other services';

    /**
     * @var ServiceBroadcaster 
     */
    private ServiceBroadcaster $broadcaster;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(ServiceBroadcaster $broadcaster)
    {
        parent::__construct();
        
        $this->broadcaster = $broadcaster;
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $this->broadcaster->subscribe(['myweb*'], function (OnMessage $event) {
            // $event->event (string|null)
            // $event->data (array|string|null)
            // $event->channel (string)
        });

        return 0;
    }
}

zipzoft/laravel-message-transporter 适用场景与选型建议

zipzoft/laravel-message-transporter 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.07k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 09 月 09 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 zipzoft/laravel-message-transporter 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 zipzoft/laravel-message-transporter 我们能提供哪些服务?
定制开发 / 二次开发

基于 zipzoft/laravel-message-transporter 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 1.07k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2021-09-09