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