我正在做一个项目。我有一些自定义验证器,它基本上是在保存任何新记录之前检查数据库中的某些数据完整性。因此,对于该检查,我需要访问Doctrine实体管理器。所以下面是我的代码。
CustomValidator.php
<?php
namespace Custom\Validator;
use ....
/**
* Class CustomValidator
* @package Custom\Validator
*/
class CustomValidator extends AbstractModel
{
public function validate()
{
//my validation rules
}
}
此AbstractModel类基本上实现了如下的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类中的这一行。
return $this->getContainer()->get('doctrine')->getManager();
我的实现有什么问题吗?我尝试搜索,但是找不到任何有用的解决方案。
更新
我相信我没有解释整个场景的10%,而10%是至关重要的部分。我实际上是在CustomValidator
中使用这个CustomCommand
的。那是主要的问题,我将在下面解释是否有人以后会遇到像我这样的类似问题。
答案 0 :(得分:1)
CustomValidator需要在services.yaml中指定一个父服务。我相信以下方法可以解决问题:
services:
Custom\Validator\CustomValidator:
parent: '@custom.abstract_model'
请参阅:https://symfony.com/doc/3.4/service_container/parent_services.html
答案 1 :(得分:0)
首先,感谢@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();