Mise en œuvre simple de websocket dans laravel 5

je dois implémenter websocket très simple et très basique dans Laravel pour implémenter le processus de synchronisation des données entre mon application phonegap en tant que client et mon site Web Laravel en tant que serveur. J'ai suivi ce tutoriel http://www.binarytides.com/websockets-php-tutorial/ implémenter et tester websocket et cela fonctionne. Comme celui-ci, j'ai besoin d'une implémentation laravel très simple où je peux appeler ma méthode de controller à partir de JS client. Le Client sera mon application phonegap. J'ai trouvé certains paquets pour websocket dans laravel avec des tutoriels, mais j'ai trouvé difficile de les mettre en œuvre. Personne n'interagissait avec les contrôleurs, ils écoutaient les événements et créaient des classes ici et là, mais pas dans les contrôleurs. J'ai écrit toute ma logique dans le Controller et je l'ai testé avec la requête ajax mais maintenant je vais l'implémenter par websocket parce que j'ai besoin de communication bidirectionnelle pour implémenter le processus de synchronisation. Je suis nouveau à Laravel donc s'il vous plaît me fournir un peu d'aide. Aussi, il sera si grand, si quelqu'un peut me dire comment intégrer le tutoriel à propos de laravel pour que le client puisse directement appeler le contrôleur pour envoyer des données.

17
demandé sur Vivek Doshi 2015-11-02 09:11:22

1 réponses

j'ai fini par utiliser le brainsocket de brainboxlabs (https://github.com/BrainBoxLabs/brain-socket). Comme son document dit son paquet laravel 4 mais il fonctionne aussi avec laravel 5 sans aucun problème.

pour installer ce paquet avec laravel 5. Suivez la documentation sur le lien GitHub ci-dessus. Où il est dit de créer un événement.fichier php dans le dossier app et certains événements liés au code. Au lieu de cette étape il suffit d'ajouter ce code lié à l'événement dans app / Providers / EventServiceProvider.fichier php. Dans sa méthode boot, ajoutez ce code qui est

Event::listen('generic.event',function($client_data){
    return BrainSocket::message('generic.event',array('message'=>'A message from a generic event fired in Laravel!'));
});

Event::listen('app.success',function($client_data){
    return BrainSocket::success(array('There was a Laravel App Success Event!'));
});

Event::listen('app.error',function($client_data){
    return BrainSocket::error(array('There was a Laravel App Error!'));
});

après cette étape il y avait une étape d'ajout de

require app_path().'/filters.php';
require app_path().'/events.php';

dans app/commencer/global.php . Vous pouvez laisser cette étape pour laravel 5.

Ok donc la socket Web a été implémentée. Vous pouvez tester en démarrant le serveur websocket en utilisant cmd en exécutant la commande artisan brainsocket:start. Vous pouvez éventuellement fournir le port artisan brainsocket:démarrer 9000

une Autre exigence était de contrôleur d'appel pour effectuer le reste de la tâche. Pour cela j'ai directement édité dans le paquet de fournisseur. Je ne recommande pas ce que c'est pas une bonne façon. Lorsque vous mettrez à jour votre paquet en utilisant composer, vos modifications seront perdues. Donc tu dois trouver une meilleure option. Mais ses juste un changement de ligne.

dans vendeur\brainboxlabs\brain-socket\src\BrainSocket\BrainSocketServer.php j'ai édité le code dans la méthode "start" et remplacez

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new BrainSocketEventListener(
                        new BrainSocketResponse(new LaravelEventPublisher())
                    )
                )
            )
            , $port
        );

avec

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
               new \FMIS\Http\Controllers\SynchronizationController(
                  new BrainSocketResponse(new LaravelEventPublisher())
                                            )
                )
            )
            , $port
        );

et dans mon fichier SynchronizationController.

j'ai ajouté ce sur top

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use BrainSocket\BrainSocketResponseInterface;

interface implémentée comme ceci.

class SynchronizationController extends Controller implements MessageComponentInterface{

et a implémenté les méthodes de cette interface.

public function __construct(BrainSocketResponseInterface $response) {
        $this->clients = new \SplObjectStorage;
        $this->response = $response;
}

public function onOpen(ConnectionInterface $conn) {
        echo "Connection Established! \n";
}


public function onMessage(ConnectionInterface $conn, $msg){
 echo "this messge gets called whenever there is a messge sent from js client";
}

public function onClose(ConnectionInterface $conn) {
    echo "Connection {$conn->resourceId} has disconnected\n";
}

public function onError(ConnectionInterface $conn, \Exception $e) {
        $msg = "An error has occurred: {$e->getMessage()}\n";
        echo $msg;
        $conn->close();
}

vous devez changer ces méthodes pour implémenter votre fonctionnalité. Après cela, vous pouvez appeler de votre client js. Et vous n'êtes pas tenu d'utiliser sa bibliothèque js. Vous envoyez simplement des données en utilisant JS client describe dans ce tutoriel http://www.binarytides.com/websockets-php-tutorial/ .

Laissez-moi savoir si quelqu'un a besoin de plus d'aide concernant sa mise en œuvre.

21
répondu hassan 2016-09-29 07:27:34