Reverb 是 Laravel 应用程序的第一方 WebSocket 服务器,将客户端和服务器之间的实时通信直接带到您的指尖。在本文中,我们将了解如何在新的 Laravel 项目上安装和配置 Laravel Reverb,并且我们将使用 Livewire 来监听广播的事件。
Laravel Reverb Installation Laravel Reverb 安装
安装新的 Laravel 项目后,您可以通过运行以下命令来安装 Laravel Reverb:
php artisan install:broadcasting
此命令将安装 reverb 包并为您设置必要的配置。它还将发布配置文件(reverb.php、broadcasting.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);
您应该在屏幕上看到转储的有效负载。