Laravel事件未发送到Pusher

7

我有一个Pusher应用程序,然后我尝试通过Laravel事件向Pusher发送消息,这是我的事件:

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NewOrder
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $email;
    public $message;


    public function __construct($email)
    {
        $this->email = $email;
        $this->message = "New order from {$email}, please check.";
        //
    }

    public function broadcastOn()
    {
        return ['new-order'];
    }

}

我试图使用路由测试来测试它,

Route::get('test', function () {
    event(new App\Events\NewOrder('John'));
    return "Event has been sent!";
});

我的 Pusher 配置已经像我的 Pusher 帐户配置一样进行了配置,但是访问 /test 后,Pusher 调试控制台没有显示任何内容。

在这里输入图片描述 这是我的 broadcasting.php 文件。

    'default' => env('BROADCAST_DRIVER', 'pusher'),


    'connections' => [

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                // 'cluster' => 'ap1',
                'encrypted' => true,
            ],
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],

        'log' => [
            'driver' => 'log',
        ],

        'null' => [
            'driver' => 'null',
        ],

    ],

];

我不知道如何从Laravel应用程序中查看Pusher的日志,有人能帮助我吗?我使用的是Laravel 5.5。


https://pusher-community.github.io/real-time-laravel/getting-started/server-debugging.html - Quezler
1
你是否按照 Laravel 广播文档页面上的说明安装了 Pusher?composer require pusher/pusher-php-server "~3.0" - Quezler
1
是的,我已经安装了它。 - Mamen
我正在按照 Pusher 网站上的教程进行学习,链接为:https://pusher.com/tutorials/web-notifications-laravel-pusher-channels。 - Mamen
你使用了事件触发吗? - parthi
显示剩余5条评论
8个回答

19

我认为问题出在你的事件类声明上,你应该实现ShouldBroadcastNow,因为它会立即触发事件,而不需要队列实现。默认情况下,你需要设置一个队列,然后运行该队列以触发事件。

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class NewOrder implements ShouldBroadcastNow
{
  ....do your stuff....
}

还要看看这个 令人惊叹的播放列表,它肯定会解决你所有的问题


5
我也遇到了这个问题大约两个小时。 你忘记实现广播了, 你可以使用:
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class NewOrder implements ShouldBroadcastNow

或者
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class NewOrder implements ShouldBroadcast

后者需要一个队列驱动程序。
愉快的编码 :)

1
谢谢!我希望 Laravel 文档能更加清晰明了。 - Benjamin Dowson

2
检查 .env 文件 QUEUE_CONNECTION=sync 或者你必须运行 php artisan queue:work

2
这对我来说是解决方案。 我有QUEUE_CONNECTION = databaseclass NewOrder implements ShouldBroadcast。 我只需运行queue:work,它就可以工作了。 另外,将ShouldBroadcast替换为ShouldBroadcastNow适用于我,而无需运行queue:work - Dev strange

1
替换此内容:
class NewOrder

使用这个:
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class NewOrder implements ShouldBroadcast

那应该可以。如果需要更多帮助,请告诉我。

1

嗨,我也遇到了这个问题,并通过清除缓存来解决它!这是代码!

php artisan config:cache
php artisan config:clear
php artisan route:cache
php artisan route:clear
php artisan optimize --force

希望对您有所帮助!

0

以下是我如何解决这个错误的方法:

  1. 确保在config/app.php中启用了广播服务
  2. 在页面中添加csrf_token元标记
    Pusher.logToConsole = true;
            var key = '<?php echo env('PUSHER_APP_KEY') ?>';
            var pusher = new Pusher(key,{
                cluster: 'ap2',
                forceTLS: true
                });
            var channel = pusher.subscribe('channel-name');
            channel.bind('App\\Events\\EventName',function (data) {
                console.log("OK");
                console.log(data);
            });

我相信你的意思是config/app.php吧? - Арсен Гоян

0
'useTLS' => true

这个选项解决了我的问题。

'options' => [
     'cluster' => env('PUSHER_APP_CLUSTER'),
     'useTLS' => true,
]

0
请在与Pusher相关的任何更改后重新启动队列。(在更改Pusher API密钥后,这对我有效。)
php artisan queue:restart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接