微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 回显服务器聊天消息通知只更新一次

如何解决Laravel 回显服务器聊天消息通知只更新一次

我有一个用 Laravel 5.8 构建的网站,上面有实时(套接字)聊天功能。问题是当我从一个客户端发送消息时,除非您转到聊天窗口,否则另一个客户端会收到通知。一旦你阅读了一条消息,它就不会再被更新,除非你硬刷新网页。

这个问题发生在我使用 Redis、Socket.io、Laravel-echo Server 时。 但是当我将其更改为 Pusher 作为广播提供程序时,一切都很好。

我的 chatcontroller.PHP 如下所示:

<?PHP

namespace App\Http\Controllers;

use App\Http\Resources\Chat as ChatResource;
use App\Http\Resources\MarketplaceTrade as MarketplaceTradeResource;
use App\Models\Chat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;


class ChatController extends Controller
{
    /**
     * Get chat resource
     *
     * @param Chat $chat
     * @return ChatResource
     */
    public function get(Chat $chat)
    {
        if (!$chat->shouldAllowUser(Auth::user())) {
            abort(403,trans('chat.access_forbidden'));
        }

        $chat->load([
            'participants' => function ($query) {
                $query->where('user_id','!=',Auth::user()->id);
            },'participants.user'
        ]);
        return new ChatResource($chat);
    }

    /**
     * Update user's participation.
     *
     * @param Chat $chat
     */
    public function updateParticipation(Chat $chat)
    {
        if (!$chat->shouldAllowUser(Auth::user())) {
            abort(403,trans('chat.access_forbidden'));
        } else {
            $chat->updateParticipation(Auth::user());
        }
    }

    /**
     * @param Chat $chat
     * @return MarketplaceTradeResource
     */
    public function latestMarketplaceTrade(Chat $chat)
    {
        if (!$chat->shouldAllowUser(Auth::user())) {
            abort(403,trans('chat.access_forbidden'));
        }

        $Trade = $chat->marketplaceTrades()
            ->latest()->with('buyer','seller')
            ->first();

        return new MarketplaceTradeResource($Trade);
    }

    /**
     * Get status of chat for authenticated user
     *
     * @param Chat $chat
     * @return array
     */
    public function participation(Chat $chat)
    {
        if (!$chat->shouldAllowUser(Auth::user())) {
            abort(403,trans('chat.access_forbidden'));
        }

        return $chat->getParticipation(Auth::user());
    }

    /**
     * Return paginated result of authenticated chat
     *
     * @param Request $request
     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
     */
    public function table(Request $request)
    {
        $chats = Auth::user()
            ->participatingChats()->latest('updated_at')
            ->with([
                'participants' => function ($query) {
                    $query->where('user_id',Auth::user()->id);
                },'participants.user'
            ]);
   

        $filters = $request->get('filters',[]);

        if (array_has($filters,'user') && $filters['user']) {
            $chats->whereHas('participants.user',function ($query) use ($filters) {
                $query->where('id',Auth::user()->id);
                $query->where('name','like',"%{$filters['user']}%");
            });
        }

        $results = paginateResult(
            $chats,$request->get('itemPerPage',10),$request->get('page',1)
        );

        return ChatResource::collection($results);
    }
}

我发现当我删除这部分时,应该收到通知的第二个客户端通常会收到通知

->with([
                'participants' => function ($query) {
                    $query->where('user_id','participants.user'
            ]);

有没有办法在不删除这部分的情况下使其工作?因为当我删除这部分聊天页面时,尽管聊天通知正常工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。