1

我正在开发 Symfony2 中的 websocket 应用程序。我使用基于 Ratchet ( http://socketo.me/ ) 的 symfony2 捆绑包调用 ClankBundle ( https://github.com/JDare/ClankChatBundle )。

我已经成功地在 symfony2 中配置了我的服务并且服务器正在工作……例如,当我在 JS network.onSubscribe 中调用时,每个已经订阅的人都会收到信息。

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 \Ratchet\ConnectionInterface $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);"

.

或者我想坚持把我的 websocket 发送到 Doctrine 中。(比如保存连接到 websocket 通道的任何人发送的每条消息。

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

我希望我很清楚(对不起我的英语......)并且有人可以帮助我!谢谢。

4

1 回答 1

1

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

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

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

<services>
    <service id="jdare_clank.chat_topic_handler" class="JDare\ClankChatBundle\Topic\ChatTopic">
        <argument>"@doctrine.orm.default_entity_manager"</argument>
    </service>

并从控制器或其他一些 ContainerAwareInterface 中的服务容器中获取您的类:

$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);
    ...

希望这会有所帮助。让我知道这是否会失去你,我会尽力提供帮助。依赖注入有点难以理解,但它是您工具包中非常强大的工具!

于 2013-07-30T23:59:34.637 回答