我需要在Laravel中实现非常简单和非常基本的websocket,以实现作为客户端的phonegap应用程序和作为服务器的Laravel网站之间的数据同步过程。我遵循了本教程http://www.binarytides.com/websockets-php-tutorial/来实现和测试websocket,并且它可以工作。像这个一样,我需要非常简单的laravel实现,在那里我可以从js客户端调用我的控制器方法。客户将是我的phonegap应用程序。我在laravel中找到了一些websocket的教程包,但我发现很难实现它们。没有人与控制器交互,他们在这里和那里听事件和创建类,但不在控制器中。我已经在Controller中编写了所有的逻辑,并用ajax请求进行了测试,但现在我将通过websocket实现它,因为我需要双向通信来实现同步过程。我是拉拉维尔的新手,所以请给我一些帮助。如果有人能告诉我如何在laravel中集成about教程,这样客户端就可以直接调用控制器来发送数据,那将是非常棒的。
我最终使用了brainboxlabs的brainsocket(https://github.com/BrainBoxLabs/brain-socket)。正如其文件所说,它的laravel 4包,但它也与laravel 5一起工作,没有任何问题。
要使用laravel 5安装此软件包。按照上面github链接上的文档进行操作。它说在应用程序文件夹中创建一个event.php文件和一些与事件相关的代码。不需要执行此步骤,只需在app/Providers/EventServiceProvider.php文件中添加与事件相关的代码即可。在其引导方法中,添加代码
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!'));
});
在这个步骤之后,有一个添加的步骤
require app_path().'/filters.php';
require app_path().'/events.php';
在app/start/global.php中。您可以将此步骤留给laravel 5。
好的,所以已经实现了Web套接字。您可以通过运行命令artisan brainsocket:start
使用cmd启动websocket服务器来进行测试。您可以选择为其提供端口工匠的智囊团:启动9000
另一个要求是调用控制器来执行其余的任务。为此,我直接编辑到提供程序包中。我不建议这样做,因为这不是一个好办法。当您使用composer更新包时,您所做的更改将丢失。所以你必须找到一个更好的选择。但这只是一句话的改变。
在vendor \brainboxlabs\brain socket\src\BrainSocket\BrainPacketServer.php中,我编辑了方法"start"中的代码并替换
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new BrainSocketEventListener(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
带有
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new FMISHttpControllersSynchronizationController(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
在我的SynchronizationController文件中。
我在顶部添加了这个
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use BrainSocketBrainSocketResponseInterface;
实现了这样的接口。
class SynchronizationController extends Controller implements MessageComponentInterface{
并实现了该接口的方法。
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 disconnectedn";
}
public function onError(ConnectionInterface $conn, Exception $e) {
$msg = "An error has occurred: {$e->getMessage()}n";
echo $msg;
$conn->close();
}
您必须更改这些方法才能实现您的功能。之后,您可以从js客户端进行调用。您也不需要使用它的js库。您只需在本教程中使用js客户端描述发送数据http://www.binarytides.com/websockets-php-tutorial/。
如果有人在执行方面需要更多帮助,请告诉我。