Angular2 + Laravel与实时和WebSockets

我build立了一个应用程序,我打算与Angular 2和laravel进行实时的战斗。 例如,你点击“攻击”button,你的对手看到他的生活实时下降。

我的应用程序构build于:

前端: Angular 2

后端: PHP Laravel 5.2

现在我正在寻找和学习我的实时战斗部分,我看到了不同的指南和教程:

  1. https://www.codetutorial.io/laravel-5-and-socket-io-tutorial/
  2. http://4dev.tech/2016/02/creating-a-live-auction-app-with-angular-2-node-js-and-socket-io/

一个教程是关于如何使用Laravel 5和套接字io

第二个是如何在NODS JS和socket io上使用Angular 2

当我说实时,我的意思是两个用户看到屏幕上发生的相同的事情)

我的后端和前端是完全分开的,我没有安装NodeJS在我的应用程序的任何地方。

这两个用户都需要看到在我的应用程序的战斗中发生的行动,它需要通过我的laravel API,并通过我的Angular 2战斗组件

我的问题是 –

使用Angular2和Laravel 5.2实时应用程序(看起来websockets)的最佳方法是什么,以获得我想要实现的所需结果?

怎么样?

在这种情况下,Laravel只是为客户端文件提供模板和服务,并充当客户端和socket.io服务器之间的接口。 它实际上不作为socket.io服务器,我不相信它可以。

所以是的,你仍然需要一些东西(节点)来承载socket.io服务器,通过PHP或其他方式与客户端进行交互。 就个人而言,我会完全跳过Laravel / PHP,只是使用节点与koa / express /任何模板您的客户端(html / js / css / etc)文件。 感觉像是对我不必要的抽象。

socket.blade.php下面的代码已经有一个连接到实际的socket.io服务器,所以我不明白为什么通过PHP / Laravel HTTP POST的额外开销是一个好主意。 安全,也许,但你可以用真正的socket.io服务器来处理。

 var socket = io.connect('http://localhost:8890'); socket.on('message', function (data) { $( "#messages" ).append( "<p>"+data+"</p>" ); }); 

如果你打算使用websocket,那么似乎没有使用laravel,因为只有一个socket能够处理前端和后端之间交换的所有数据,所以如果你不介意改变你的引擎,可以试试Meteor, https://www.meteor.com/

对于您的用例的实时性,websockets绝对是一种可行的方式。 应该得到更新的玩家应该在同一个“房间”,所以你可以更容易地播放更改。 对于其他function,您可以使用websockets或常规API调用直接从您的客户端应用程序代码与您的api和套接字服务器之间的某种通信,例如通过Redis的后端。

TLDR:

  1. 所有的数据通过套接字,节点服务器进行api调用,并向活动播放器广播改变
  2. 直接使用API​​的应用程序,使用pub / sub队列foo来进行laravel和node之间的通信,以便将活动播放器的播放改变

选项1:

  • Angular前端应用程序
    • 设置websocket连接
    • 添加foo游戏的触发器,它将通过套接字连接发送数据,并由nodeserver处理
    • 只与套接字谈判
  • 节点服务器
    • 提供前端应用程序
    • 处理sockets连接,每场比赛分割球员
    • 处理套接字调用并调用laravel API来对数据进行突变
    • 处理行动并向游戏X中的玩家广播改变
  • Laravel REST API
    • authenticationx
    • 默认的CRUD foo

选项2:

  • Angular前端应用程序
    • 直接与api谈话
    • 使用套接字来收听更新
  • 节点服务器
    • 提供前端应用程序
    • 处理websocket数据
    • 在队列上监听API发布的数据
    • 通过套接字广播更改游戏x中的玩家
  • Laravel REST API
    • validation
    • CRUD
    • 突变x触发器在Redis或其他节点服务器可以/应该监听的队列中发布

我确信有更多的方法可以设置这个,你只需要决定你想要什么。 也许介绍Redis是你不想要的,在这种情况下你的节点应用程序将有更多的事情要做。 如果你想使用类似Redis的东西,你需要从你的前端应用程序进行API调用,或者select通过节点应用程序来完成,结合2个选项。