玩具版 Laravel 私有广播系统

前言

首先我的这个教程是在我之前发的一个教程的基础上改的。链接: 博客:laravel-websockets 实现“低配版”广播系统 。基本可以肯定必须照着我的那个教程做完接着照着这个教程做才行。另外我参考的主要是这个英文教程: medium.com/@dennissmink/laravel-ec... 。不过由于年代久远,这个英文教程已经发霉了,没法食用。直接按照那个英文教程做可能会导致项目文件被破坏。

如果读者不是在做完我之前发的那篇教程之后马上做这个的话,比如重启过电脑之类的。需要重新运行以下命令:

php artisan serve
php artisan websockets:serve
npm run dev

说实话我是不建议读者直接用我这个方法的,除非你只是为了辅助理解广播系统。这篇教程很多地方我只是一知半解,甚至最后有没有成功我都是没法百分百确认的。其实我写这篇文章更多算是给自己做的一个笔记吧。也希望有人能帮我挑挑毛病。

本体

取消注释 BroadcastServiceProvider

在 config\app.php 里取消注释这条:

App\Providers\BroadcastServiceProvider::class,

这条默认是注释掉的。

安装 Laravel Breeze

在项目目录中运行以下命令:

composer require laravel/breeze --dev
php artisan breeze:install
npm install
php artisan migrate

第二条命令好像有点卡。我这里后两条命令不执行好像也没问题,可能是因为在上一篇文章里执行过了吧。为了尽量严谨一些还是加上吧。上面几条命令来自这里: 入门套件《Laravel 9 中文文档》

安装完之后打开 127.0.0.1:8000/ ,点右上角的 Register,然后注册一个账号。注册成功之后会自动登陆。

创建事件

在项目目录中运行以下命令:

php artisan make:event PrivateEvent

app\Events\PrivateEvent.php

<?php

namespace App\Events;

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

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

    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('user.' . $this->user->id);
    }
}

客户端脚本

在 resources\views\welcome.blade.php 的 head 标签内的结尾改成下面这样:

        @vite('resources/js/app.js')
        <script>
            window.onload = function(){
                Echo.channel('trades')
                .listen('NewTrade', (e) => {
                    console.log(e.trade);
                });
                user = {{ Auth::check() ? Auth::user()->id : "null" }};
                window.Echo.private('user.' + user)
                .listen('PrivateEvent', (e) => {
                    console.log(e);
                });
            };
        </script>
    </head>

再说一下如何改吧。之前的这里的代码是这样的:

        @vite('resources/js/app.js')
        <script>
            window.onload = function(){
                window.Echo.channel('trades')
                .listen('NewTrade', (e) => {
                    console.log(e.trade);
                });
            };
        </script>
    </head>

把上段的代码改成上段代码的上段代码那样就行了。

我自作聪明把 {!! !!} 换成 {{ }} 了。还改了获取 user id 的方法。还有 null 改成 “null” 了,反正改成这个在不登录的时候这里就不会报错了。

修改 routes/channels.php

在 routes/channels.php 中添加以下内容:

Broadcast::channel('user.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

修改 routes/web.php

在 routes/web.php 中添加以下内容:

Route::get('test-broadcast', function(){
    event(new \App\Events\PrivateEvent(Auth::user()));
});

验证

打开 127.0.0.1:8000/ ,然后打开开发者模式,切换到控制台。然后再用其他浏览器或者同一个浏览器的不同用户,或者隐私模式再打开一个这个页面,也切换到控制台。然后打开 127.0.0.1:8000/test-broadcast 。可以看到只有登陆过的浏览器实例的控制台才有反应。

不登录的话控制台有个报错,我就暂时不管了。等我以后有时间再研究吧。谁要是有意愿和时间等的话欢迎帮我完善一下。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!