2017-10-16 3 views
2

:. 서비스 컨테이너에서 심포니 서비스와 같은 고유 한 인스턴스는 말한다 심포니 문서에서

"

이 모든 서비스는 기본적으로 공유됩니다 이것은 당신이 서비스를 검색 할 때마다, 당신은 동일한 인스턴스를 얻을 수 있습니다 것을 의미한다. 이것은 대개 원하는 동작이지만 경우에 따라 항상 새 인스턴스를 가져 오려고 할 수 있습니다. " 내가 다른 컨트롤러에서 변수 $notification을 좀하고 싶습니다

class ServerCommand extends ContainerAwareCommand { 

    public $notification; 

    /** 
    * Configure a new Command Line 
    */ 
    protected function configure() 
    { 
     $this->setName('Project:notification:server') ->setDescription('Start the notification server.'); 
    } 

    public function getNotification() 
    { 
     return $this->notification; 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $this->notification = new Notification(); 
     $server = IoServer::factory(new HttpServer(
      new WsServer(
       $this->notification 
      ) 
     ), 8081); 

     $server->loop->addPeriodicTimer(1, function() { 
      $this->notification->sendToAll('Hello'); 
     }); 

     $server->run(); 
    } 
} 

:

이 클래스 인 services.yml

services: 
    project.notification: 
    class: NotificationsBundle\Command\ServerCommand 

입니다. 내가 할 때 "존재하지 않는 객체"($ 알림) 오류가 발생했습니다.

PHP 응용 프로그램/콘솔 프로젝트 : 알림 :

내가 다음 명령을 실행하여 서비스를 실행하는 문서에서 서버

을 내가 동일한 인스턴스 서비스 있지만 모든를 얻을 수 있습니다 말한다 실행 시간 :

$this->container->get('Project.notification')->notification 

나는 비 객체 오류가 발생했습니다. 즉, 처음 서비스를 실행했을 때 생성 한 객체 $notification을 잃어 버렸습니다. 다른 컨트롤러에서 메시지를 보내야하기 때문에 컬렉션 사용자 목록에 액세스해야합니다 (객체 $ 알림 안에 있습니다).

아이디어가 있으십니까?

+0

을 이것은 서비스가 호출간에 지속 (저장)되는 것을 의미하지는 않으며 호출 당이 서비스의 인스턴스가 하나만 생성된다는 것을 의미합니다. 그래서 당신은 신선한 것을 얻습니다. – Mitchel

+0

그래서 영구적 인 서비스를 어떻게 설정할 수 있습니까? – Minniek

+0

데이터를 데이터베이스 또는 세션에 저장하여이를 수행 할 수 있습니다. '무기한으로'PHP 인터프리터를 실행하지 않는 한 영구적 인 서비스를 가질 수 없습니다. 그래서 getNotification() 메소드가 이미 통지가 있는지 확인하고, 통지가없는 경우 get/load one을 호출하여 리턴 할 수 있습니다. – Mitchel

답변

1

마지막으로 나는 해결책 있어요 ". 이것은 당신이 서비스를 검색 할 때마다, 당신은 동일한 인스턴스를 얻을 수 있습니다 것을 의미한다"

use WebSocket\Client; 
     $client = new Client("ws://127.0.0.1:8080"); 
     $client->send("Hello from controller");