Вещание не отправляет сообщение из другой группы - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь внедрить чат в рабочий проект, который содержит несколько типов пользователей.

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'company' => [
        'driver' => 'session',
        'provider' => 'companies',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

Файл события

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;
use App\ChartMessages;

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

    public $chartMessage;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PresenceChannel('chart');
    }
}

Контроллер

namespace App\Http\Controllers;

use Auth;
use App\User;
use Illuminate\Http\Request;
use App\ChartMessages;
use App\Events\MessageSent;

class ChartController extends Controller
{
    public function __contruct(){
        $this->middalware('auth');
    }

    public function index($type, $to_id)
    {
        if($type == 'company'){
            $company = Auth::guard('company')->user();
            if($company && isset($company->id)){
                return ChartMessages::where(['from' => 'company', 'from_id' => $company->id])->orWhere(['to' => 'company', 'to_id' => $company->id])->get();
            }
        }

        if($type == 'user'){
            if(Auth::user()  && isset(Auth::user()->id)){
                $user = User::findOrFail(Auth::user()->id);
                return ChartMessages::where(['to' => 'user', 'to_id' => $user->id])->orWhere(['from' => 'user', 'from_id' => $user->id])->get();
            }
        }
    }  

    public function sendMessage(Request $request){
        $chartMessage = ChartMessages::create([
            'from' => 'company',
            'to' => 'user',
            'from_id' => $request->from_id,
            'to_id' => $request->to_id,
            'from_name' => $request->from_name,
            'to_name' => $request->to_name,               
            'message' =>   $request->message
        ]);

        broadcast(new MessageSent($chartMessage))->toOthers();

        return ['status' => 'success'];
    }
}

1010 * Вю *

export default {
    props: ['to', 'from', 'type'],

    data() {
        return {
            messages: [],
            newMessage: ''
        }
    },

    created(){
        this.fetchMessages();

        Echo.join('chart').
        listen('MessageSent', (event) => {
            this.messages.push(event.chartMessage);
        })
    },

    methods:{
        fetchMessages(){
            axios.get('/chart-messages/'+this.type+'/'+this.to.id).then( response => {
                this.messages = response.data;
            })
        },
        sendMessage(){
            this.messages.push({
                to_id: this.to.id,
                from_id: this.from.id,
                to_name: this.to.name,
                from_name: this.from.name,
                message: this.newMessage
            });
            axios.post('/send-message', {'message': this.newMessage, 'from_id': this.from.id, 'to_id': this.to.id, 'from_name': this.from.name, 'to_name': this.to.name,});
            this.newMessage = '';
        }
    }
}

В файле channel.php

Broadcast::channel('chart', function () { return (Auth::guard('company')->check() || Auth::check());});

Для этого я в файл BroadcastServiceProvider добавил

Broadcast::routes(['middleware' => ['web', 'auth:company']]);

А теперь, когда пользователи типа пользователи отправляют сообщения, они получают всех и пользователей типа пользователей и компаний.

Но когда пользователи компаний отправляют сообщения, их могут видеть только пользователи, подобные компаниям, но не пользователи типа.

Любые идеи, как сделать так, чтобы сообщения таких пользователей, как компании, могли видеть кого угодно.

...