web-dev-qa-db-fra.com

Implémentation Websocket simple dans laravel 5

J'ai besoin d'implémenter un 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 Laravel Site Web en tant que serveur. J'ai suivi ce tutoriel http://www.binarytides.com/websockets-php-tutorial/ pour implémenter et tester websocket et cela fonctionne. Comme celui-ci, j'ai besoin très simple laravel = implémentation où je peux appeler ma méthode de contrôleur à partir du client js. Le client sera mon application phonegap. J'ai trouvé quelques packages pour websocket dans laravel avec des tutoriels, mais j'ai trouvé difficile de les implémenter. Personne 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 Controller et l'ai testée avec la requête ajax mais maintenant je vais l'implémenter par websocket car j'ai besoin d'une communication bidirectionnelle pour implémenter Processus de synchronisation. Je suis nouveau à Laravel alors veuillez me fournir de l'aide. e si génial si quelqu'un peut me dire comment intégrer le didacticiel about dans laravel pour que le client puisse appeler directement le contrôleur pour envoyer des données.

19
Hassan Dad Khan

J'ai fini par utiliser la cervelle de brainboxlabs ( https://github.com/BrainBoxLabs/brain-socket ). Comme son document l'indique, son package laravel 4 mais il fonctionne également avec laravel 5 sans aucun problème).

Pour installer ce package avec laravel 5. Suivez la documentation sur le lien github ci-dessus. Où il est indiqué de créer un fichier event.php dans le dossier de l'application et certains codes liés aux événements. Au lieu de cette étape, simplement ajoutez ce code lié à l'événement dans le fichier app/Providers/EventServiceProvider.php. Dans sa méthode de démarrage, 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

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

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

Ok donc la prise Web a été implémentée. Vous pouvez tester en démarrant le serveur websocket à l'aide de cmd en exécutant la commande artisan brainsocket:start. Vous pouvez éventuellement lui fournir le porte-cervelle artisan port: start 9000

Une autre exigence était d'appeler le contrôleur pour effectuer le reste de la tâche. Pour cela, j'ai directement édité dans le package du fournisseur. Je ne le recommande pas car ce n'est pas un bon moyen. Lorsque vous mettrez à jour votre package en utilisant composer vos modifications seront perdues. Vous devez donc trouver une meilleure option. Mais ce n'est qu'un changement d'une ligne.

Dans le fournisseur\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é ça en haut

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

Interface implémentée comme celle-ci.

class SynchronizationController extends Controller implements MessageComponentInterface{

et 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 modifier ces méthodes pour implémenter vos fonctionnalités. Après cela, vous pouvez appeler depuis votre client js. Et vous n'êtes pas obligé d'utiliser sa bibliothèque js également. Vous envoyez simplement des données en utilisant le client js décrit dans ce tutoriel http://www.binarytides.com/websockets-php-tutorial/ .

Faites-moi savoir si quelqu'un a besoin d'aide pour sa mise en œuvre.

23
Hassan Dad Khan