Как использовать контейнер для доступа к параметрам в пользовательском исключении - PullRequest
0 голосов
/ 28 ноября 2018

Я немного изо всех сил пытался понять, как я могу использовать Container, который дает мне доступ к параметрам, расположенным в config/parameters.yml.

Проблема в моих руках, я создал некоторые пользовательскиеExceptions и я создал библиотеку, которая ослабляет меня каждый раз, когда срабатывает одно из этих исключений.Для этого мне нужно отправить container в Logger, чтобы иметь возможность протащить их в библиотеку.

Но я не могу ухватиться за container.У меня есть идея, что ее нужно вводить и что я могу достичь этого в config/services.yml, но я не понимаю, как.

Пока что это то, чего я достиг:

Мой родительский объект пользовательских исключений

Поскольку все исключения исходят из родительского, все они вызовут Logger.И в этот момент мне нужно, чтобы container существовал:

abstract class CriticalLogAlertException extends \RuntimeException
{
    protected $logger;

    public function __construct ($message = "", $code = 0, Throwable $previous = NULL)
    {
        parent::__construct($message, $code, $previous);

        Log::critical(
                      $this->message, 
                      [], 
                      AbstractCredentialsFactory::YAML_TYPE,
                     'PARAMETERS CONTAINER ACCESS NEEDS TO BE ADDED HERE'
                    );
    }

    abstract public function generateMessage($message) : string;
}

То, что я думал о создании для этого класса метода setContainer(), который я мог бы использовать в своем config/services.yml:

public function setContainer(ContainerInterface $container)
{
    $this->container - $container;
}

Итак, на данный момент я могу создать property в абстрактном классе и использовать его для передачи его в library, как это было бы уже доступно в class execution.Хотя я не уверен, что это достижимо или правильно ;

My config / services.yml

Ниже приведенокод, который я добавил в свой контейнер услуг:

 ExceptionContainer:
      class: AppBundle\Exception\CriticalLogAlertException
      calls:
          - [ setContainer,[ @service_container ] ]

Может ли кто-нибудь помочь мне понять, если я что-то упускаю или неправильно понимаю, чтобы сделать его доступным?

ПРИМЕЧАНИЕ: Если что-то еще нужно, чтобы лучше понять мою проблему, пожалуйста, дайте мне знать, чтобы я мог обновить свой вопрос:)

Заранее спасибо!

1 Ответ

0 голосов
/ 09 мая 2019

Ооо, это заняло у меня некоторое время, но мне пришлось погрузиться глубже, чтобы понять, что означало пройти некоторые бои и исследования, прежде чем я смог понять это немного лучше.

Был оставлен на некоторое время, хотя я и работал некоторое время назад, но для тех, кто интересуется тем же и новым для процесса, позвольте мне поделиться немного:)

Поскольку я создавал экземплярисключения с throw new означали, что у меня был прямой доступ к методу __construct.Это означало, что если мое исключение ожидало ContainerInterface, я должен был его предоставить.

Теперь с этим могут работать два случая.

1.Инъекция

С помощью Инъекции я могу автоматически связать требования либо с помощью доступной службы (которую мы можем проверить с помощью команды ниже);

php bin/console debug:autowiring

Или, если инъекция Пользовательский класс , мне нужно было указать, где, что и что он предоставляет в services.yml

Возможный пример того, что я предлагаю добавить к services.yml, можно увидеть ниже:

TestException:
        class: AppBundle\Exception\TerminationAmlkyc
        arguments: ['@service_container']
        public: true

2.Instantiation

В моем случае я либо передавал ContainerInterface всякий раз, когда мне было нужно его для нового класса, либо был в состоянии Instanciated, как я упоминал выше.

Поскольку мое происхождение было черезContainerAwareCommand Я мог бы использовать $this->getContainer(), чтобы извлечь его и затем передать его исключениям при необходимости.

throw new TestException($this->getContainer())
...