$ this-> getContainer()在Symfony 3.x中为Command返回null

时间:2018-10-22 16:12:33

标签: php symfony-3.4 symfony3.x

我正在做一个项目。我有一些自定义验证器,它基本上是在保存任何新记录之前检查数据库中的某些数据完整性。因此,对于该检查,我需要访问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的。那是主要的问题,我将在下面解释是否有人以后会遇到像我这样的类似问题。

2 个答案:

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

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