🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ Mahdiabedini
متد listen کار نمی‌کنه
جامعه لاراول ایجاد شده در ۰۵ دی ۱۴۰۰

سلام من دقیقا مثل آموزشها پیش رفتم ولی متد listen وقتی که یک پیام جدید ایجاد میکنیم اصلا اجرا نمیشه تعداد کاربران و نام کاربری و ای دی کاربرها از pusher دریافت میشه و کار میکنه ولی متد listen اصلا کار نمیکنه و حتی خطا هم نمی‌ده چرا ؟ دوستان لطفا راهنمایی بفرمایید که باید چطور این باگ را برطرف کنم . دوستانی که این موضوع را حل کردند لطفا راهنماییی کنند ممنون .

سلام دوست عزیز

بهترین روش این هستش که یا کدتون رو ارسال کنید یا خط به خط دیباگ انجام بدین و مطمئن باشید که تابع در جای درست صدا زده میشه و مفسر پی‌اچ‌پی وارد این تابع میشه

رضا * ۰۶ دی ۱۴۰۰، ۰۵:۲۳
class ChatController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
    public function index()
    {
        return view('chat.index');
    }
}
//--------------
class MassageController extends Controller
{
    public function index()
    {
        $massages = Massage::with(['user'])->latest()->take(5)->get();
        return response()->json($massages, 200);
    }
    public function store(Request $request)
    {
        $massage = auth()->user()->massages()->create([
            'body'=>$request->body,
        ]);
        broadcast(new MessageCreated($massage))->toOthers();
        return response()->json($massage , 200);
    }
}
//---------------Chat.vue-----------------

<script>
import Bus from '../bus'
import moment from 'moment'
export default {
    name: "chat",
    data() {
        return {
            bodytext: null,
            bodyBackedUp: null,
        }
    },
    methods: {
        handleMassageInput(event) {
            this.bodyBackedUp = this.bodytext;
            if (event.keyCode === 13 && !event.shiftKey) {
                event.preventDefault();
                this.send()
            }
        },
        send() {
            if (!this.bodytext || this.bodytext.trim === "") {
                return;
            }
            let tempMessage = this.buildTempMessage();
            Bus.$emit('message.added', tempMessage)
            axios.post('/chat/massages', {
                body: this.bodytext.trim()
            }).catch(() => {
                this.bodytext = this.bodyBackedUp;
                Bus.$emit('message.removed', tempMessage)
            });
            this.bodytext = null;
        },
        buildTempMessage() {
            let tempId = Date.now();
            return {
                id: tempId,
                body: this.bodytext,
                created_at: moment().format('YYYY-MM-DD HH:mm'),
                selfOwned: true,
                user: {
                    name: user.name,
                }
            }
        },
    },
}
script>
//----------------Massage.vue
<template>
    <div class="chat__message" :class="{'chat__message--own':massage.selfOwned}">
        <strong class="chat__message-user">
            {{massage.user.name}}
        strong>
        <span class="chat__message-timestamp">
            {{massage.created_at}}
        span>
        <p class="chat__message-body">
            {{massage.body}}
        p>
    div>
template>
<script>
export default {
    name:'massage',
    props:['massage'],
}
script>
//---------------Messages.vue
<template>
    <div class="chat__messages" ref="message">
        <massage v-for="massage in massages" :key="massage.id" :massage="massage">
        massage>
    div>
template>
<script>
import Bus from '../bus'
export default {
    name: 'massages',
    data() {
        return {
            massages: [],
        }
    },
    methods: {
        removeMassage(id) {
            this.massages = this.massages.filter((message) => {
                return message.id !== id
            })
        }
    },
    mounted() {
        axios.get("/chat/massages").then((response) => {
            this.massages = response.data
        });
        Bus.$on('message.added', (massage) => {
            this.massages.unshift(massage);
            if (massage.selfOwned) {
                this.$refs.message.scrollTop = 0;
            }
        })
            .$on('message.removed', (massagetext) => {
                this.removeMassage(massagetext.id);
            })
    },
}
script>
//---------------Users.vue
<template>
    <div class="users">
        <div class="users__header">{{users.length}} <span>کاربر آنلاینspan>div>
        <div class="users__user"  v-for="user in users">
            <a href="#">{{user.name}}a>
        div>
    div>
template>
<script>
import Bus from '../bus'
export default {
    data() {
        return {
            users: [],
        }
    },
    mounted() {
        Bus.$on('users.here', (users) => {
            this.users = users
        })
            .$on('users.joined', (user) => {
                this.users.unshift(user)
            })
            .$on('users.left', (user) => {
                this.users = this.users.filter((u) => {
                    return user.id !== u.id
                })
            });
    }
}
script>
//------------------------------app.js
require('./bootstrap');
window.Vue = require('vue').default;
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
Vue.component('chat', require('./components/Chat.vue').default);
Vue.component('users', require('./components/Users.vue').default);
Vue.component('massage', require('./components/Massage.vue').default);
Vue.component('massages', require('./components/Massages.vue').default);
const app = new Vue({
    el: '#app',
});
//----------------bootstrap.js
window._ = require('lodash');
try {
    window.Popper = require('popper.js').default;
    window.$ = window.jQuery = require('jquery');
    require('bootstrap');
} catch (e) {}
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    encrypted:true,
    // forceTLS: true
});
require('./echo');
//--------------------bus.js
import Vue from 'vue'
export default new Vue();
//----------------echo.js
import Bus from './bus'
Echo.join('chat')
    .here((users) => {
        console.log(users);
        Bus.$emit('users.here', users)
    })
    .joining((user) => {
        console.log(user);
        Bus.$emit('users.joined', user)
    })
    .leaving((user) => {
        console.log(user);
        Bus.$emit('users.left', user)
    })
    .listen('MessageCreated', (e) => {
              console.log(e);
        Bus.$emit('message.added', e.message)
    })
//------------------------Massage.php
App\\Models;
use Illuminate\\Database\\Eloquent\\BroadcastsEvents;
use Illuminate\\Database\\Eloquent\\Factories\\HasFactory;
use Illuminate\\Database\\Eloquent\\Model;
class Massage extends Model
{
    use HasFactory;
    protected $fillable =['body' ];
    protected $appends = [
        'selfOwned'
    ];
    public function getSelfOwnedAttribute()
    {
        return $this->user_id === auth()->user()->id;
    }
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
//-------------------MessageCreated.php
App\\Events;
use App\\Models\\Massage;
use Illuminate\\Broadcasting\\InteractsWithSockets;
use Illuminate\\Broadcasting\\PresenceChannel;
use Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast;
use Illuminate\\Foundation\\Events\\Dispatchable;
use Illuminate\\Queue\\SerializesModels;
class MessageCreated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $message ;
    public function __construct(Massage $massage)
    {
        $this->message = $massage;
    }
    public function broadcastWith()
    {
        $this->message->load('user');
        return [
            'message' => array_merge($this->message->toArray(), [
                'selfOwned' => false
            ])
        ];
    }
    public function broadcastOn()
    {
        return new PresenceChannel('chat');
    }
}



سلام این تمام کدی بود که من نوشتم حالا نمی‌دونم چرا listen اجرا نمیشه تعداد کاربران ان لاین خیلی خوب کار میکنه ولی پیام به صورت realtime کار نمی‌کنه ؟

Mahdiabedini ۰۶ دی ۱۴۰۰، ۰۵:۵۰

سلام دوست عزیز در بخشی که message.add رو امیت (emit) می‌کنید، متغیری که همراه امیت ارسال می‌کنید e.message هستش. مقدار null با این امیت فرستاده میشه

رضا * ۰۶ دی ۱۴۰۰، ۰۶:۳۱

نه مقدارش null نیست من dd و alert یا console.log که می‌گیرم مقدارش برابره دقیقا برابر پیامی که تو tempMessage ساختیم اصلا تابع .listen اجرا نمیشه من حتی یه console.log هم اونجا گرفتم که یه پیغام تستی به من بده اون را هم اجرا نکرد و اصلا داخل اش نشده



Mahdiabedini ۰۶ دی ۱۴۰۰، ۰۷:۰۴

سلام آقای عابدینی، منم این مشکل رو دارم ، تونستین حلش کنین؟

عباس ملکی ۱۷ تیر ۱۴۰۱، ۱۵:۰۸