【问题标题】:Laravel broadcast does not send events to pusherLaravel 广播不向推送者发送事件
【发布时间】:2017-05-01 08:11:43
【问题描述】:

我已将 Laravel 设置为使用推送器为 Laravel Echo 发送事件,但我从工匠控制台触发的事件无法到达推送器。 我从推送调试控制台触发的事件工作正常,所以前端部分没问题。 vagrant VM 会不会干扰它?

我的 .env 文件

QUEUE_DRIVER=sync
...
PUSHER_KEY=<key>
PUSHER_SECRET=<secret>
PUSHER_APP_ID=<app_id>

我的广播.php

'default' => env('BROADCAST_DRIVER', 'pusher'),
...
'connections' => [

    'pusher' => [
        'driver'  => 'pusher',
        'key'     => env('PUSHER_KEY'),
        'secret'  => env('PUSHER_SECRET'),
        'app_id'  => env('PUSHER_APP_ID'),
        'options' => [
            'cluster'   => 'eu',
            'encrypted' => true
        ],
    ],
    ...
]

事件:

class NewMessage implements ShouldBroadcast
{
    public function broadcastOn()
    {
         return [new Channel('chat.'.$this->conversation->id)];
    }
}

该事件是从观察模型created 事件的观察者类触发的。

public function created(Chat\Message $message)
{
    event(new NewMessage($message));
}

观察者注册在AppServiceProvider

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Message::observe(MessageObserver::class);
    }
}

当我运行创建新消息的控制台命令时,终端会显示:

php artisan chat:broadcast asdasd
[2016-12-15 16:26:44] local.INFO: Broadcasting [eventname] on channels [channel] with payload: {...}  

注意:大多数名称都是保密的,所以我使用了事件名称、频道等占位符,但我希望相关信息在那里。

谢谢!

【问题讨论】:

  • 我在 Laravel 5.1 中遇到了同样的问题。有趣的是,它正在工作,然后神秘地停止了。还没弄清楚为什么。我可以告诉你,干扰的不是流浪虚拟机……我们让它在虚拟机上工作。

标签: laravel laravel-5.3 pusher laravel-echo


【解决方案1】:

确保.env 文件中的 BROADCAST_DRIVER 设置为这样的推送器

BROADCAST_DRIVER=pusher

broadcasting.php 中修改魔药数组,如下代码

'pusher' => [
    'driver'  => 'pusher',
    'key'     => env('PUSHER_KEY'),
    'secret'  => env('PUSHER_SECRET'),
    'app_id'  => env('PUSHER_APP_ID'),
    'options' => [
      //leave these empty in your code
    ],
],`

保存这些更改并运行你的 laravel 服务器我希望这对你有用......!!

【讨论】:

【解决方案2】:

在广播任何事件之前,您首先需要注册 App\Providers\BroadcastServiceProvider。在新的 Laravel 应用程序中,您只需在 config/app.php 配置文件的 providers 数组中取消注释此提供程序即可。

     /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    //App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,

.env 文件

BROADCAST_DRIVER=pusher

PUSHER_APP_ID=app_id
PUSHER_APP_KEY=auth-key
PUSHER_APP_SECRET=secret
PUSHER_APP_CLUSTER=cluster

你可以像这样在控制器中触发事件

broadcast(new NewMessage($message));

你可以运行php artisan config:cache来确保

【讨论】: