2017-10-16 10 views
2

それは言う:。symfonyのサービスとして一意のインスタンス

「サービスコンテナでは、すべてのサービスがデフォルトで共有されているこれは、あなたがサービスを取得するたびに、あなたが同じインスタンスを取得しますことを意味します。これは通常、必要な動作ですが、場合によっては常に新しいインスタンスを取得することもできます。

これはservices.yml

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

は、これはクラスです。

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(); 
    } 
} 

私は別のコントローラからの変数$notificationを取得したいと思います。私がそれをすると、 "存在しないオブジェクト"($通知)というエラーが出ます。

私は、次のコマンドを実行してサービスを実行します。

PHPアプリ/コンソールプロジェクト:通知:それは私が同じインスタンス・サービスが、すべてを取得しますと言いドキュメントでサーバー

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

私はオブジェクト以外のエラーが発生しました。つまり、最初にサービスを実行したときに作成したオブジェクト$notificationを失ったということです。 私は別のコントローラからメッセージを送信する必要があるので、ユーザの収集リスト(オブジェクト$ notification内にあります)にアクセスする必要があります。

アイデア?

+0

を「これは、あなたがサービスを取得するたびに、あなたが同じインスタンスを取得しますことを意味します。」これは、サービスがコール間で永続化(保存)されるわけではなく、コールごとにこのサービスのインスタンスが1つだけ作成されることを意味します。あなたは新鮮なものを得ますが、1回の呼び出しにつき1つだけです。 – Mitchel

+0

私は永続化されたサービスをどのように設定できますかという質問に変更します。 – Minniek

+0

これは、データをデータベースやセッションなどに保存することで実現できます。あなたは '永久に' PHPインタープリタを稼働させない限り、永続化されたサービスを持つことはできません。 getNotification()メソッドは、通知がすでに存在するかどうかをチェックし、そうでなければ、それを作成/ロードして返します。 – Mitchel

答えて

1

最後に私が解決策だ:

use WebSocket\Client; 
     $client = new Client("ws://127.0.0.1:8080"); 
     $client->send("Hello from controller"); 
関連する問題