如何在 Laravel 项目上安装和配置 Laravel Reverb

379 阅读4分钟

Reverb 是 Laravel 应用程序的第一方 WebSocket 服务器,将客户端和服务器之间的实时通信直接带到您的指尖。在本文中,我们将了解如何在新的 Laravel 项目上安装和配置 Laravel Reverb,并且我们将使用 Livewire 来监听广播的事件。

Laravel Reverb Installation Laravel Reverb 安装

安装新的 Laravel 项目后,您可以通过运行以下命令来安装 Laravel Reverb:

php artisan install:broadcasting

此命令将安装 reverb 包并为您设置必要的配置。它还将发布配置文件(reverb.phpbroadcasting.php 和 channels.php),以便您在需要时进行任何更改。

系统还会提示我们安装前端依赖项。您可以只选择默认选项,即 yes

如果您已将项目从 Laravel 10 升级到 Laravel 11,则需要确保已相应地更新了 broadcasting.php 文件。由于此文件已在 v10 中存在,因此 reverb 不会覆盖它,我们需要确保 .env 文件和此文件之间没有不匹配。

我们可以通过先检查 .env 来解决这个问题,其中键定义为 BROADCAST_CONNECTION=reverb,在 broadcasting.php 文件中,确保它设置如下:

'default' => env('BROADCAST_CONNECTION', 'null'),

在 Laravel 10 中,密钥设置为 BROADCAST_DRIVER,因此请务必更新它。

Configuration 配置

一切都差不多设置好了,我们只需要根据我们的项目配置进行一些更改

我们在此处更新的第一件事是,根据项目使用的 http 方案,您可能需要将 .env 文件更新为 http 或 https。

REVERB_SCHEME=https

我们还需要根据项目的APP_URL更新REVERB_HOST。我将 .env 文件粘贴到此处以供参考,我已经为本教程修剪了不必要的配置:

APP_URL=http://reverb-tutorial.test
BROADCAST_CONNECTION=reverb

# by default the queue connection is set to database,
# and if you dont want to use queue,
# you can set it to sync
QUEUE_CONNECTION=sync

# note that I'm not passing the http or https here,
# as it's already defined in the REVERB_SCHEME
REVERB_HOST="reverb-tutorial.test"
REVERB_PORT=8080
REVERB_SCHEME=https

确保在终端中运行 npm run dev 来编译资产,一切顺利。

现在我们已经设置好了所有内容,我们可以开始监听广播的事件了。我们将使用 Livewire 来监听事件。因此,让我们从安装 Livewire 开始,然后创建一个新的 Livewire 组件。

composer require livewire/livewire

然后创建一个新的 Livewire 组件,在本教程中,我将它命名为 Dashboard:

php artisan make:livewire Dashboard

让我们打开 Dashboard 组件并定义一个侦听器,该侦听器将侦听名为 dashboard 的公共通道和事件 OrderShipped

要在 Livewire 中定义事件,我们将使用 On 属性,我们还将传递 echo: 前缀,它将指示 Livewire 侦听由 Laravel Echo 生成的事件。

组件如下所示:

<?php

namespace App\Livewire;

use Livewire\Attributes\On;
use Livewire\Component;

class Dashboard extends Component
{
    public function render()
    {
        return view('livewire.dashboard');
    }

    #[On('echo:dashboard,OrderShipped')]
    public function dump($payload)
    {
        dd($payload);
    }
}

让我们继续在我们的 Laravel 应用程序中定义这个 OrderShipped 事件。我们可以通过创建一个新事件来做到这一点:

php artisan make:event OrderShipped

而既然我们要广播这个事件,就需要在 event 类中实现 ShouldBroadcast 接口,现在我们将它广播到公共频道,并将频道命名为 dashboard。 活动如下所示:

<?php

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 OrderShipped implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     */
    public function __construct(public int $orderId = 1)
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array<int, \Illuminate\Broadcasting\Channel>
     */
    public function broadcastOn(): array
    {
        return [
            new Channel('dashboard'),
        ];
    }
}

我还向事件传递了一个 orderId,当我们调度此事件时,它可以作为参数传递。如下所示:

OrderShipped::dispatch(1);

由于我们在此处传递了一个虚拟 id,并且我们将有效负载转储到侦听器上,因此在执行侦听器时,它将转储此 ID。 现在让我们继续运行 reverb:start 命令:

php artisan reverb:start --debug

此命令将启动 reverb 服务器,您可以在终端中看到日志。 现在,最后一件事是 dispatch Event。有多种方法可以分派事件,但现在,我们将使用 tinker 来分派事件。 在 tinker 控制台上,我们可以按如下方式调度事件:

App\Events\OrderShipped::dispatch(1);

您应该在屏幕上看到转储的有效负载。