Laravel 在两个浏览器标签页中使用 websockets 时抛出意外错误

问题描述

我正在使用 Laravel 开发一个电子商务网站,我已经快完成了,但今天我决定使用 Pusher 和 Laravel echo 来为其提供实时行为,但我一直在努力解决一些意外错误

我正在使用 livewire 框架,基本上每次在购物车中添加删除某些产品时,我都会使用事件来刷新我的组件,因此我向组件添加了侦听器,这些侦听器是导航栏中的购物车图标和侧面显示所选产品概览的部分:

eCommerce shop

enter image description here

到目前为止,我一直在做的管理购物车的工作是向按钮添加一个事件,我在会话中保存一个关联数组,其中键是产品的 ID,值是该产品的数量和然后发出一个 livewire 事件来刷新购物车图标和侧边部分,最后我从会话中获取 id 并查询数据库获取更多产品信息。

ShopContainer.PHP

class ShopContainer extends Component
{
    public $products;
    public $categories;

    ...

    public function mount($products,$categories)
    {
        $this->products = $products;
        $this->categories = $categories;
    }

    public function render()
    {
        return view('livewire.shop-container');
    }

    public function addToCart($productId)
    {
        $products = Session::has('products') ? Session::get('products') : [];
        $products[$productId] = 1;

        Session::put('products',$products);
        $this->emit('cart:update');
    }
}

cartIcon.PHP

class CartIcon extends Component
{
    protected $listeners = [
        'cart:update' => '$refresh',];

    public function render()
    {
        $nProducts = Session::has('products') ? count(Session::get('products')) : 0;

        return view('livewire.cart-icon',compact('nProducts'));
    }
}

SideShopCart.PHP

class SideShopCart extends Component
{
    protected $listeners = [
        'cart:update' => '$refresh',];

    public function render()
    {
        $productsDict = Session::has('products') ? Session::get('products') : [];

        $products = [];

        foreach($productsDict as $key => $value){
            array_push($products,Product::find($key));
        }

        return view('livewire.side-shop-cart',compact('products'));
    }
}

这样做的问题是,如果用户打开了两个浏览器选项卡,刷新只会反映在执行的选项卡上。这就是为什么我将 websockets 与 pusher 和 laravel echo 一起使用,它的工作原理相同,只是改变了触发的事件和这样的侦听器:

ShopContainer.PHP

class ShopContainer extends Component
{
    ...

    public function addToCart($productId)
    {
        ...
        //$this->emit('cart:update');
        event(new CartUpdate);
    }
}

CartIcon.PHP 和 SideShopCart.PHP

{
    protected $listeners = [
        //'cart:update' => '$refresh','echo:cart,CartUpdate' => '$refresh',];
}

事件 (CartUpdate.PHP)

class CartUpdate implements Shouldbroadcast
{
    use dispatchable,InteractsWithSockets,SerializesModels;

    ...

    public function broadcastOn()
    {
        return new Channel('cart');
    }
}

这按我的预期工作,它会刷新我打开的任何选项卡中的购物车,但我问这个问题的原因是有时我会遇到这样的异常:

enter image description here

有时我会收到 500 内部服务器错误
我已经搜索了很多,但我没有发现任何有用的东西,也许它可能与会话中的保存有关,因为错误描述了一些关于它的内容,但我不知道发生了什么。 欢迎任何帮助,谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)