Уведомление в режиме реального времени с использованием laravel в качестве внутреннего API и AngularJS в качестве внешнего - PullRequest
0 голосов
/ 26 апреля 2018

Можно ли использовать оповещение в реальном времени в AngularJS, когда внутренний интерфейс API - laravel?я должен использовать laravel echo в AngularJS или есть другое решение для этого?

Поскольку я искал, я должен использовать pusher в качестве сервера веб-сокетов и использовать laravel echo, который является библиотекой JS.

Вопрос в том, стоит ли мне использовать библиотеку laravel-echo в AngularJS или есть другое решение?

К вашему сведению: API-интерфейсы laravel (back-end) отделены от AngularJS (front-end), с которым они взаимодействуют через запросы CRUD, которые аутентифицируются с помощью O-Auth.

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Я использовал решение @ Mohammad_Hosseini раньше, но после обновления Laravel 5.4 до 5.8 оно больше не работает.Последний, но тем не менее важный;Решение @ Mohammad_Hosseini не включало аутентификацию и частные каналы.

Итак, я настоятельно рекомендую использовать laravel-echo-server для простого обновления.Кроме того, это открытый исходный код и поддержка великого сообщества.

0 голосов
/ 03 мая 2018

Мне удалось решить эту проблему с помощью клиента сокетов laravel + redis + socket.io +, я поставил здесь свое решение в надежде прекратить тратить время на попытки других разобраться.

cd your-project-name

Установитьпакеты

npm install express ioredis socket.io --save

Ваш файл package.json будет выглядеть как

{
  "private": true,
  "devDependencies": {
    "gulp": "^3.8.8",
    "laravel-elixir": "*"
  },
  "dependencies": {
    "express": "^4.12.4",
    "ioredis": "^1.4.0",
    "redis": "^0.12.1",
    "socket.io": "^1.3.5"
  }
}

composer require predis/predis

Создание события

php artisan make:event EventName

Убедитесь, что оно implements ShouldBroadcast

Весь класс EventName.php должен выглядеть следующим образом:

<?php namespace App\Events;

use App\Events\Event;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class EventName extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $data;

    public function __construct()
    {
        $this->data = array(
            'power'=> '10'
        );
    }

    public function broadcastOn()
    {
        return ['test-channel'];
    }
}

использовать этот код в угловых js:

<script src="js/socket.io.js'"></script>
    <script>
        //var socket = io('http://localhost:3000');
        var socket = io('http://192.168.10.10:3000');
        socket.on("test-channel:App\\Events\\EventName", function(message){
            // increase the power everytime we load test route
            $('#power').text(parseInt($('#power').text()) + parseInt(message.data.power));
        });
    </script>

Маршрутизация Настройте три маршрута следующим образом.Добавьте их в ваш файл app/Http/routes.php.

Route::get('/', function() {
    // this doesn't do anything other than to
    // tell you to go to /fire
    return "go to /fire";
});

Route::get('fire', function () {
    // this fires the event
    event(new App\Events\EventName());
    return "event fired";
});

Route::get('test', function () {
    // this checks for the event
    return view('test');
});

Создайте файл socket.js в корневом каталоге вашего проекта

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel', function(err, count) {
});
redis.on('message', function(channel, message) {
    console.log('Message Recieved: ' + message);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function(){
    console.log('Listening on Port 3000');
});

Примечание: убедитесь, что вы установили redis сервер + подключениеэто Laravel с использованием .env или файла базы данных.

...