Ho bisogno di implementare websocket molto semplice e molto semplice in Laravel per implementare il processo di sincronizzazione dei dati tra la mia app phonegap come client e il mio sito Web Laravel come server. Ho seguito questo tutorial http://www.binarytides.com/websockets-php-tutorial/ per implementare e testare websocket e funziona. Come questo ho bisogno di un'implementazione laravel molto semplice dove posso chiamare il mio metodo controller dal client js. Il client sarà la mia applicazione PhoneGap. Ho trovato alcuni pacchetti per websocket in laravel con tutorial, ma ho trovato difficile implementarli. Nessuno stava interagendo con i controller, stavano ascoltando eventi e creando classi qua e là ma non nei controller. Ho scritto tutta la mia logica in Controller e l'ho testata con una richiesta Ajax, ma ora la implementerò tramite websocket perché ho bisogno di una comunicazione bidirezionale per implementare il processo di sincronizzazione. Sono nuovo di Laravel quindi ti prego di darmi un aiuto. Inoltre sarà così bello se qualcuno può dirmi come integrare il tutorial su in laravel in modo che il client possa chiamare direttamente il controller per inviare i dati.Implementazione Websocket semplice in laravel 5
risposta
Ho finito per utilizzare la presa di forza di brainboxlabs (https://github.com/BrainBoxLabs/brain-socket). Come il suo documento dice il suo pacchetto laravel 4 ma funziona anche con laravel 5 senza alcun problema.
Per installare questo pacchetto con laravel 5. Seguire la documentazione sul link github precedente. Dove dice di creare un file event.php nella cartella app e qualche codice relativo agli eventi. Invece di questo passaggio, aggiungi semplicemente il codice relativo all'evento nel file app/Provider/EventServiceProvider.php. Nel suo metodo di avvio, aggiungere che il codice che è
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!'));
});
Dopo questa fase c'è stata una fase di aggiungere
require app_path().'/filters.php';
require app_path().'/events.php';
in app/start/global.php. Puoi lasciare questo passaggio per laravel 5.
Ok così è stato implementato il socket Web. È possibile eseguire il test avviando il server Websocket utilizzando cmd eseguendo il comando artisan brainsocket:start
. Opzionalmente è possibile fornirlo come porta-porta artigianale: start 9000
Un altro requisito era chiamare il controller per eseguire il resto dell'attività. Per questo ho modificato direttamente nel pacchetto provider. Non consiglio questo perché non è un buon modo. Quando aggiornerai il tuo pacchetto usando il compositore, le tue modifiche andranno perse. Quindi devi trovare un'opzione migliore. Ma è solo un cambiamento di linea.
In vendor \ brainboxlabs \ cervello-socket \ src \ BrainSocket \ BrainSocketServer.php Ho modificato il codice nel metodo "start" e sostituire
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new BrainSocketEventListener(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
con
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new \FMIS\Http\Controllers\SynchronizationController(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
E nel mio file SynchronizationController .
ho aggiunto questo in cima
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use BrainSocket\BrainSocketResponseInterface;
interfaccia implementata in questo modo.
class SynchronizationController extends Controller implements MessageComponentInterface{
e implementato i metodi di questa interfaccia.
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();
}
È necessario modificare questi metodi per implementare le funzionalità. Dopo questo puoi chiamare dal tuo client js.E non sei obbligato a usare anche la sua libreria js. Basta inviare i dati utilizzando il client js descritto in questo tutorial http://www.binarytides.com/websockets-php-tutorial/.
Fammi sapere se qualcuno ha bisogno di ulteriore aiuto per quanto riguarda la sua implementazione.
Amico, spiegazione stupefacente. +1. Mi stavo chiedendo se è possibile utilizzare il controller senza dover effettivamente modificare il file nel fornitore? in modo che gli aggiornamenti di laravel possano essere installati liberamente. Grazie per l'aiuto. – Learner
@Learner è possibile creare una classe socket personalizzata e un comando che estenda le classi brainSocket. Non l'ho fatto io ma guardandolo è quello che farei. – sourRaspberri
Purtroppo BrainSocket non ha aggiornato la propria fonte per lavorare con Laravel 5.5 ... – AmjadoV
Il mio consiglio è di eseguire Socket.io sotto un server nodo. –
Voglio usare un semplice socket js sul lato client che è disponibile. Perché funzionerà con PhoneGap, quindi voglio mantenere le cose semplici. – hassan
In realtà usando socket.io si otterrà una connessione Websocket con poche righe di codice. È così che l'ho implementato personalmente. –