Symfony服务作为唯一实例

Symfony服务作为唯一实例,symfony,service,Symfony,Service,Symfony文档中指出: 在服务容器中,默认情况下共享所有服务。这意味着每次检索服务时,都会得到相同的实例。这通常是您想要的行为,但在某些情况下,您可能希望始终获得一个新实例 这是服务部 services: project.notification: class: NotificationsBundle\Command\ServerCommand 这是一节课: class ServerCommand extends ContainerAwareCommand { p

Symfony文档中指出:


在服务容器中,默认情况下共享所有服务。这意味着每次检索服务时,都会得到相同的实例。这通常是您想要的行为,但在某些情况下,您可能希望始终获得一个新实例

这是服务部

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
。当我这样做时,我得到了一个错误“不存在的对象”($notification)

我通过执行以下命令来运行服务:

php应用程序/控制台项目:通知:服务器

文档中说我将获得相同的实例服务,但每次执行时:

$this->container->get('Project.notification')->notification
我有一个非对象错误。换句话说,我丢失了第一次运行服务时创建的对象
$notification
。 我需要访问用户集合列表(在对象$notification中),因为我需要从另一个控制器发送消息


有什么想法吗?

最后我找到了一个解决方案:

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

“这意味着每次检索服务时,都会得到相同的实例。”这并不意味着服务在两次调用之间被持久化(保存),而是意味着每次调用只创建一个此服务的实例。因此,每次调用都会得到一个新的服务,但每次调用只有一个。因此,我将把问题改为如何设置持久化服务?您可以通过将数据保存到数据库或会话来实现这一点。除非让php解释器“无限期”运行,否则无法拥有持久化服务。因此,您可以让getNotification()方法检查通知是否已经存在,如果不存在,则创建/加载一个通知并返回该通知。我的服务正在独立运行。在任何时候我都会关闭窗口服务,你只是问了同样的问题,然后被告知php根本不能这样工作。无论您认为它应该如何工作,运行控制台命令,然后期望结果在控制器中可用都是行不通的。