$ this-> getContainer () возвращает ноль в Symfony 3.x для команды - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над проектом.У меня есть собственный валидатор, который в основном проверяет целостность данных в моей базе данных перед сохранением новой записи.Поэтому для этой проверки мне нужен доступ к менеджеру сущностей 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 голосов
/ 24 октября 2018

Во-первых, спасибо @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();
0 голосов
/ 24 октября 2018

CustomValidator должен иметь родительский сервис, указанный в services.yaml.Я полагаю, что сработало бы следующее:

services:
    Custom\Validator\CustomValidator:
        parent: '@custom.abstract_model'

См .: https://symfony.com/doc/3.4/service_container/parent_services.html

...