2015-07-16 26 views
9

Pracuję w aplikacji Symfony 2 i muszę używać websocket.Symfony 2 GeniusesOfSymfony/WebSocketBundle

Znalazłem pakiet o nazwie GeniusesOfSymfony/WebSocketBundle i zintegrowałem go w systemie. Ten pakiet jest oparty na JDare/ClankBundle, ale w ostatnim czasie TopicPeriodicTimerInterface używa do ponownego wysyłania informacji dla klienta co określony czas.

Mam go w mojej aplikacji, ale muszę uzyskać zalogowanego użytkownika. Pakiet ma usługę o nazwie @ gos_web_socket.websocket.client_manipulator do manipulowania informacjami o użytkowniku, ale kiedy próbuję uzyskać informacje o użytkowniku, tylko usługa dostarcza mi anonimowego użytkownika, ale jestem zalogowany dla kogoś użytkownika.

Każdy miał ten sam problem lub znał rozwiązanie tego problemu ???

Odpowiedz

2

zapraszam do naśladowania procedury udostępniania sesji i uwierzytelniania użytkownika, jak wyjaśniono w dokumencie wiązki użyć: https://github.com/GeniusesOfSymfony/WebSocketBundle/blob/master/Resources/docs/SessionSetup.md

Najpierw trzeba zaimplementować obsługi sesji Symfony, jeśli zdecydujesz się użyć PDO Session Handler, dokument znajduje się tutaj: http://symfony.com/doc/master/cookbook/configuration/pdo_session_storage.html (Nie zapomnij utworzyć odpowiedniego DB, jeśli tak zdecydujesz, deklarując wszystkie usługi, parametry itd.).

Następnie trzeba ustawić config.yml korzystać z obsługi sesji:

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

konfiguracji GOS websocket za korzystanie z niego, a także:

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

koniec dostępne w dokumentacji pierwszy link pokaże kilka sposobów użycia manipulatora klienta. Wiem, że lepiej jest kopiować wklej, ale naprawdę nie mam ochoty kopiować wklejanie całego dokumentu jest użyteczne, ani jasne.

na własny użytek, nie mam manipulator klienta, po prostu użyć

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

w celu odzyskania użytkownikowi bieżącego połączenia. Model clientStorage jest dostępny, jeśli podasz go (@gos_web_socket.client_storage) do konstruktora usług jako argument. Oczywiście, trzeba dostosować swój konstruktor:

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

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

dostęp do innych użytkowników, można wziąć trochę inspiracji:

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

nadzieję, że to pomoże, nie mam aż tyle doświadczenia z nim, jak to jest moje pierwsze użycie. Zapraszam do zadawania pytań bezpośrednio na GitHubie, jeśli nadal tkwisz w martwym punkcie (problemy z częścią), ponieważ autor prawdopodobnie może ci pomóc!

(Również Przypuszczałem użyć tematu)

+0

to da takie same wyniki, jak użycie bezpośrednio manipulatora .. anonimowego użytkownika, nawet jeśli jest zalogowany. – user3746259

+0

Próbowałeś? Pomyślnie zrobię to z zalogowanym użytkownikiem. –

+0

Tak, próbowałem, właśnie otrzymuję anonimowego użytkownika. Czy przeczytałeś edycję, którą napisałem w powyższym pytaniu? Myślę, że to jest problem z plikami cookie, czy mógłbyś opublikować swoją konfigurację (porty, domeny itp.)? – user3746259

1

miałem podobną sytuację, ale zalogowanego użytkownika. Jeśli wykonasz wszystkie kroki konfiguracji, teraz spróbujesz uzyskać dostęp do adresu IP swojej aplikacji (127.0.0.1) ex: http://127.0.0.1/app_dev.php/chat/ Kiedyś uzyskuję dostęp do mojej domeny (http://mydominename/app_dev.php/chat/) i nie otrzymałem zalogowanego użytkownika w GeniusesOfSymfony/WebSocketBundle.

Mój kod:

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 **/ 
} 

Nie zapomnij dodać nowy argument do serwisu

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

To może być początek rozwiązania.