$this->getContainer() 在 Symfony 3.x 中为 Command 返回 null
$this->getContainer() is returning null in Symfony 3.x for Command
我正在做一个项目。我有一些自定义验证器,它基本上是在保存任何新记录之前检查我的数据库中的某些数据完整性。因此,对于该检查,我需要访问 Doctrine 实体管理器。下面是我的代码。
CustomValidator.php
<?php
namespace Custom\Validator;
use ....
/**
* Class CustomValidator
* @package Custom\Validator
*/
class CustomValidator extends AbstractModel
{
public function validate()
{
//my validation rules
}
}
这个 AbstractModel class 基本上实现了如下所示的 ContainerAwareInterface:
AbstractModel.php
<?php
namespace Custom\Model;
use ....
abstract class AbstractModel implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
/**
* @return ContainerInterface
*/
protected function getContainer()
{
return $this->container;
}
/**
* @return ObjectManager
*/
public function getObjectManager()
{
return $this->getContainer()->get('doctrine')->getManager();
}
/**
* @param $entityClass
* @return ObjectRepository
*/
public function getRepository($entityClass)
{
return $this->getObjectManager()->getRepository($entityClass);
}
}
在我的 service.yml
文件中,我定义了 AbstractModel 依赖项,如下所示:
services:
custom.abstract_model:
class: Custom\Model\AbstractModel
abstract: true
public: true
calls:
- [setContainer, ["@service_container"]]
现在,当我尝试 运行 验证器时,出现以下错误:
Call to a member function get() on null
这表示 AbstractModel 中的这一行 class。
return $this->getContainer()->get('doctrine')->getManager();
我的实现有什么问题吗?我尝试搜索,但没有找到任何有用的解决方案。
更新
我相信我没有解释整个场景的 10%,而 10% 是关键部分。我实际上是在 CustomCommand
中使用这个 CustomValidator
。这是主要问题,如果以后有人遇到类似我的问题,我会在下面解释。
CustomValidator 需要在 services.yaml 中指定父服务。我相信以下内容可以解决问题:
services:
Custom\Validator\CustomValidator:
parent: '@custom.abstract_model'
参见:https://symfony.com/doc/3.4/service_container/parent_services.html
首先感谢@Trappar 回答我的问题。他的回答非常适合我之前描述的场景。但是我没有放完整的细节,遗漏的部分是最重要的部分。
所以,当我更新我的问题时,我现在将解释这个场景。
我有一个 CustomCommand
看起来像这样:
<?php
namespace Custom\Command;
class CustomCommand extends Command
{
protected function configure()
{
//my configuration
}
protected function execute(InputInterface $input, OutputInterface $output)
{
//my custom code
$oValidator = new CustomValidator();
$oValidator->validate($aParams);
}
}
}
事情是这样的,我没有得到我想要的容器。所以,我进行了一些广泛的研究,发现对于这种情况,你必须扩展 ContainerAwareCommand
而不是 Command
。 ContainerAwareCommand
已经扩展了 Command
本身,您还将获得将由应用程序内核提供的容器,如下所示。
$this->container = $application->getKernel()->getContainer();
我正在做一个项目。我有一些自定义验证器,它基本上是在保存任何新记录之前检查我的数据库中的某些数据完整性。因此,对于该检查,我需要访问 Doctrine 实体管理器。下面是我的代码。
CustomValidator.php
<?php
namespace Custom\Validator;
use ....
/**
* Class CustomValidator
* @package Custom\Validator
*/
class CustomValidator extends AbstractModel
{
public function validate()
{
//my validation rules
}
}
这个 AbstractModel class 基本上实现了如下所示的 ContainerAwareInterface:
AbstractModel.php
<?php
namespace Custom\Model;
use ....
abstract class AbstractModel implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
/**
* @return ContainerInterface
*/
protected function getContainer()
{
return $this->container;
}
/**
* @return ObjectManager
*/
public function getObjectManager()
{
return $this->getContainer()->get('doctrine')->getManager();
}
/**
* @param $entityClass
* @return ObjectRepository
*/
public function getRepository($entityClass)
{
return $this->getObjectManager()->getRepository($entityClass);
}
}
在我的 service.yml
文件中,我定义了 AbstractModel 依赖项,如下所示:
services:
custom.abstract_model:
class: Custom\Model\AbstractModel
abstract: true
public: true
calls:
- [setContainer, ["@service_container"]]
现在,当我尝试 运行 验证器时,出现以下错误:
Call to a member function get() on null
这表示 AbstractModel 中的这一行 class。
return $this->getContainer()->get('doctrine')->getManager();
我的实现有什么问题吗?我尝试搜索,但没有找到任何有用的解决方案。
更新
我相信我没有解释整个场景的 10%,而 10% 是关键部分。我实际上是在 CustomCommand
中使用这个 CustomValidator
。这是主要问题,如果以后有人遇到类似我的问题,我会在下面解释。
CustomValidator 需要在 services.yaml 中指定父服务。我相信以下内容可以解决问题:
services:
Custom\Validator\CustomValidator:
parent: '@custom.abstract_model'
参见:https://symfony.com/doc/3.4/service_container/parent_services.html
首先感谢@Trappar 回答我的问题。他的回答非常适合我之前描述的场景。但是我没有放完整的细节,遗漏的部分是最重要的部分。
所以,当我更新我的问题时,我现在将解释这个场景。
我有一个 CustomCommand
看起来像这样:
<?php
namespace Custom\Command;
class CustomCommand extends Command
{
protected function configure()
{
//my configuration
}
protected function execute(InputInterface $input, OutputInterface $output)
{
//my custom code
$oValidator = new CustomValidator();
$oValidator->validate($aParams);
}
}
}
事情是这样的,我没有得到我想要的容器。所以,我进行了一些广泛的研究,发现对于这种情况,你必须扩展 ContainerAwareCommand
而不是 Command
。 ContainerAwareCommand
已经扩展了 Command
本身,您还将获得将由应用程序内核提供的容器,如下所示。
$this->container = $application->getKernel()->getContainer();