2015-07-16 6 views
9

Я работаю в приложении symfony 2, и мне нужно использовать websocket.Symfony 2 GeniusesOfSymfony/WebSocketBundle

Я нашел пакет с именем GeniusesOfSymfony/WebSocketBundle и интегрирую его в систему. Этот пакет основан на JDare/ClankBundle, но в firth используется функция TopicPeriodicTimerInterface для повторной отправки информации клиенту через определенное время.

У меня есть это в моем приложении, но мне нужно получить зарегистрированного пользователя. Пакет имеет службу с именем @ gos_web_socket.websocket.client_manipulator, чтобы манипулировать информацией пользователя, но когда я пытаюсь получить информацию о пользователе, только служба получает меня анонимным пользователем, но я зарегистрирован для кого-то пользователя.

У любой проблемы была такая же проблема или знать решение для этого ???

ответ

2

Я приглашаю вас следовать процедуре совместного сеанса и аутентификации пользователей, как описано в док расслоения вы используете: https://github.com/GeniusesOfSymfony/WebSocketBundle/blob/master/Resources/docs/SessionSetup.md

Прежде всего, необходимо реализовать обработчик сеанса Symfony, если вы решите использовать PDO Session Handler, документ находится здесь: http://symfony.com/doc/master/cookbook/configuration/pdo_session_storage.html (Не забудьте создать соответствующую БД, если вы это выбрали, объявив все службы, параметры и т. Д.).

Далее, вы должны установить config.yml использовать обработчик сеанса:

framework: 
    ... 
    session: 
     handler_id: session.handler.pdo # adapt if you chose a different one 

Setup ГСН WebSocket для его использования, а также:

gos_web_socket: 
    ... 
    client: 
     firewall: main # the name of your firewall (can be an array if multiple) 
     session_handler: @session.handler.pdo 

конца имеющейся документации на первая ссылка покажет вам несколько способов использования вашего клиентского манипулятора. Я знаю, что лучше скопировать пасту, но я действительно не чувствую, что копия, вставляющая весь документ, полезна и не ясна.

Для моего собственного использования, у меня нет клиента манипулятором, я просто использую

$this->clientStorage->getClient($connection->WAMP->clientStorageId); 

для извлечения пользователя с текущим соединением. clientStorage доступен, если вы передадите его (@gos_web_socket.client_storage) конструктору службы в качестве аргумента. Конечно, вам нужно адаптировать свой конструктор:

class AcmeTopic implements TopicInterface 
{ 
    /** 
    * @param ClientStorageInterface $clientStorage 
    */ 
    protected $clientStorage; 

    public function __construct(ClientStorageInterface $clientStorage) 
    { 
     ... 

Чтобы получить доступ к другим пользователям, вы можете занять некоторое вдохновение:

foreach($topic as $subscriber) 
{ 
    $subscriber->event($topic->getId(), 
        ['msg' => $this->clientStorage 
            ->getClient($connection->WAMP->clientStorageId) 
            ->getUsername().' is now online!']); 
} 

Надеется, что это помогает, я не так много опыта работы с ним, так как это мое первое использование. Я приглашаю вас спросить прямо на GitHub, если вы все еще застряли (часть вопросов), поскольку автор, вероятно, может помочь вам больше!

(Кроме того, я предположил, что вы используете Тему)

+0

это даст только те же результаты, что и использование непосредственно манипулятора .. анонимный пользователь, даже если вы вошли в систему. – user3746259

+0

Вы попробовали? Я успешно получаю зарегистрированного пользователя. –

+0

Да, я попробовал, я просто возвращаю анонимного пользователя. Вы прочитали редактирование, которое я сделал в вопросе выше? Я думаю, что это проблема с cookie, не могли бы вы разместить свой конфиг (порты, домен и т. Д.). – user3746259

1

У меня была похожая ситуация, и получил вошедшего в систему пользователя. Если вы выполните все шаги настройки, теперь пытается получить доступ к IP-адресу вашего приложения (127.0.0.1) ex: http://127.0.0.1/app_dev.php/chat/ Я использовал для доступа к моему доменному имени (http://mydominename/app_dev.php/chat/), и я не получил зарегистрированного пользователя в GeniusesOfSymfony/WebSocketBundle.

Мой код:

use Gos\Bundle\WebSocketBundle\Topic\TopicInterface; 
use Gos\Bundle\WebSocketBundle\Client\ClientManipulatorInterface; 
use Ratchet\ConnectionInterface; 
use Ratchet\Wamp\Topic; 
use Gos\Bundle\WebSocketBundle\Router\WampRequest;  
class ChatTopic implements TopicInterface 
{ 
    protected $clientManipulator; 

/** 
* @param ClientManipulatorInterface $clientManipulator 
*/ 
public function __construct(ClientManipulatorInterface $clientManipulator) 
{ 
    $this->clientManipulator = $clientManipulator; 
} 

public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request) 
{ 
    var_dump($this->clientManipulator->getClient($connection)); //To show in WebSocket console. 
    /** Rest of code **/ 
} 

Не забудьте добавить новый аргумент службы

myclass_name.chat_topic: 
    class: MyBundle\Topic\ChatTopic 
    tags: 
     - { name: gos_web_socket.topic } 
     arguments: [ @gos_web_socket.websocket.client_manipulator ] 

Это может быть начало вашего решения.