$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 而不是 CommandContainerAwareCommand 已经扩展了 Command 本身,您还将获得将由应用程序内核提供的容器,如下所示。

$this->container = $application->getKernel()->getContainer();