如何在websocket symfony应用程序的服务中使用Entity、Form、Controller



我正在Symfony2中开发一个websocket应用程序。我使用一个名为ClankBundle的symfony2捆绑包(https://github.com/JDare/ClankChatBundle)谁是以棘轮为原型的(http://socketo.me/)。

我已经成功地在symfony2中配置了我的服务,服务器正在工作…举个例子,当我在JS网络中调用时。订阅每个已经订阅的人都会收到信息。

class ChatTopic implements TopicHandlerInterface
{
/**
 * Announce to this topic that someone else has joined the chat room
 * Also, set their nickname to Guest if it doesnt exist.
 * 
 * @param RatchetConnectionInterface $conn
 * @param $topic
 */
  public function onSubscribe(Conn $conn, $topic)
  {
      if (!isset($conn->ChatNickname))
      {
          $conn->ChatNickname = "Guest"; **how i have to do if i want to use "$this->getUser(); " here ?**
      }
      $msg = $conn->ChatNickname . " joined the chat room.";
      $topic->broadcast(array("msg" => $msg, "from" => "System"));
  }

但现在,我想使用我已经构建的一些其他工具,比如"在我的服务中"的实体或表单。

例如,我希望能够在我的服务中执行"$this->getUser()"来返回用户的伪代码。例如,向连接到该通道的每个客户端返回"伪已加入该通道"。

这个类是我服务的一部分,我想在内部使用

$this->getUser 

$em = $this->getDoctrine()->getManager();
$em->persist($music);"

或者我想坚持把我的东西扔到教条里。(比如保存任何连接到网络套接字通道的人发送的每条消息。

正如你所看到的,我对Symfony2和websocket不太满意,但我正在学习!

我希望我很清楚(对不起我的英语…),有人能帮我!谢谢

要持久化实体,需要首先将实体管理器注入到类中。

class ChatTopic implements TopicHandlerInterface
{
    protected $em;
    public function __construct($em) {
        $this->em = $em;
    }
}

您需要在services.xml 中注入依赖项

<services>
    <service id="jdare_clank.chat_topic_handler" class="JDareClankChatBundleTopicChatTopic">
        <argument>"@doctrine.orm.default_entity_manager"</argument>
    </service>

从控制器或其他ContainerwareInterface中的服务容器中获取类:

$chatTopic = $this->getContainer()->get('jdare_clank.chat_topic_handler');

获取用户更为棘手,因为您无法访问该类中的安全上下文,因为它不具有容器意识。有几种方法可以做到这一点。在我们的案例中,我们实际上实现了一个安全的websocket(wss)协议,并在其中创建了一个登录协议,因此我们可以在每个连接中存储一个用户id。但一种快速而肮脏的方法是简单地将用户id添加到另一个控制器中的会话中。

$userId = $this->get('security.context')->getToken()->getUser()->getId();
$session = $this->get('session');
$session->set('user', (str) $userId);

然后,您可以从类中的会话中获取用户。

public function onSubscribe(Conn $conn, $topic)
{
    $userId = $conn->Session->get('user');
    $user = $this->em->getRepository('AcmeUserBundle:User')->find((int) $userId);
    ...

希望这会有所帮助。如果这一切让你失去了信心,请告诉我,我会尽力帮助你。依赖注入有点让人难以理解,但它在你的工具包中是一个非常愚蠢的工具!

相关内容

  • 没有找到相关文章

最新更新