监听回调在 Pusher 中不起作用 API Laravel 5.4

Listen callback is not working in Pusher API Laravel 5.4

问题

我可以确认 Pusher API 正在接收消息。我在 Pusher 网站的调试控制台中看到了。但是监听回调根本不起作用。

我关注this tutorial to implement Pusher in Laravel 5.4

下面是逐步完成的事情。

  1. composer require pusher/pusher-php-server
  2. npm install --save laravel-echo pusher-js
  3. 在您的 resources/assets/js/bootstrap.js
  4. 中实例化了 Echo 实例
  5. 初始化 envbootstrap.js 文件中的推送键。

最后,我在 blade 中写了下面的代码。

<script>
    window.Echo.channel('SendMessageChannel.1')
        .listen('App.Events.SendMessageEvent', (e) => {
            console.log(e);
        });
</script>

控制器代码

broadcast(new SendMessageEvent("Hi"))->toOthers();

事件代码

class SendMessageEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $Message;

    public function __construct($message)
    {
        $this->Message = $message;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('SendMessageChannel.2');
    }

}

我错过了什么吗?

自 6 个月以来,我一直在非常有效地使用 Laravel 5.4 事件。我在进行初始设置时遇到了同样的麻烦。让我用我所做的一切来指导你让它工作。

我可以看到您有 controller 发起事件,SendMessageEvent 将消息内容发送到 pusherjs。您需要检查以下内容才能开始。

检查 1:

但是您没有提到是否定义了事件处理程序。事件处理程序充当 SendMessageEvent 与其实际广播者之间的桥梁。 所以定义一个 Eventhandler 创建一个像 app / Handlers / Events / 这样的文件夹。 (这里Handlers和Events是文件夹。其中Events在Handlers里面)

在此 Events 文件夹中创建一个文件,其名称例如

HandleMyMessage.php 并将此代码放入其中:

<?php
namespace App\Handlers\Events;
use App\Events\SendMessageEvent;    // This should be your event class..
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class HandleMyMessage{
   protected $name;

   public function __construct() {
      //
   }
   public function handle(Message $event) {
        // No need to write anything here
   }
}

检查 2:app / Providers / EventServiceProvider.php 位置应该有一个提供者,并将以下代码放在 EventServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\SendMessageEvent' => [
            'App\Handlers\Events\EventServiceProvider',
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
    }
}

检查 3: 您应该像这样更改在控制器中发送事件消息的语法:

$broadcast_data['first_name'] = 'John';
$broadcast_data['last_name'] = 'Doe';
$return_socket['data'] = $broadcast_data;

Event::fire(new Message($return_socket));       //  Sending message to pusherjs via Laravel Event.

关于此的更多信息,您还需要在系统上安装 Redis 运行。

希望这对您有所帮助。如果您需要有关上述任何内容的更多信息,请发表评论。我正在发布相同的参考 link。

编码愉快!!! :-)

  1. 您必须收听:SendMessageEvent 没有命名空间。
  2. 当您收听私人频道时,您需要收听 private-SendmessageChannel 或者您使用 Echo.private('SendmessageChannel')

因为我们在某些部分通过 teamspeak 解决了这个问题,所以很难在这个答案中详细解释它。

还有一个问题是事件在客户端开始收听之前就被触发了。最好的方法是使用推送器控制台进行调试并触发自定义事件。

我成功了。下面是正确的代码。我希望这对其他人发送实时消息有用。

工作

<script>
    window.Echo.channel('private-SendMessageChannel.{!! \Auth::user()->UserID !!}')
        .listen('SendMessageEvent', (e) => {
            console.log(e);
        });
</script>

控制器代码

broadcast(new SendMessageEvent("Hi", 1))->toOthers();
//Here 1 is recepient ID

事件代码

class SendMessageEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $Message;
    private $UserID;

    public function __construct($message, $RecepientID)
    {
        $this->Message = $message;
        $this->UserID = $RecepientID;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('SendMessageChannel.' . $UserID);
    }

}

在我的例子中,我使用了:

    public function broadcastAs()
    {
        return 'message';
    }

如果您设置了广播名称,则必须在侦听器中使用不同的名称。

对于和我犯过同样错误的人:

If you customize the broadcast name using the broadcastAs method, you should make sure to register your listener with a leading . character. This will instruct Echo to not prepend the application's namespace to the event:

https://laravel.com/docs/9.x/broadcasting#broadcast-name