【发布时间】: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 根本不能这样工作。不管你认为它应该如何工作,运行控制台命令然后期望结果在控制器中可用是行不通的。