【问题标题】:Symfony service as unique instanceSymfony 服务作为唯一实例
【发布时间】:2017-10-16 22:37:04
【问题描述】:

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

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

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

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

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

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

有什么想法吗?

【问题讨论】:

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

标签: symfony service


【解决方案1】:

终于找到了解决办法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多