2016-03-02 2 views
1

Сегодня утром SensioLabs Insight удалил платиновый значок из одного из моих распределенных пакетов.Контейнер для инъекций Symfony не должен передаваться в качестве аргумента

Контейнер для инъекций Symfony не должен передаваться в качестве аргумента.

/** 
* Sets the Container. 
* 
* @param ContainerInterface|null $container 
*/ 
public function setContainer(ContainerInterface $container = null) 

Контейнер для инъекций на основе Symfony был найден в качестве аргумента.

метод является частью следующей службы:

rch_jwt_user.credential_fetcher: 
    class: RCH\JWTUserBundle\Service\CredentialFetcher 
    calls: 
     - [ setContainer, [ "@service_container" ] ] 

Я знаю, что я могу передать контейнер в качестве аргумента конструктора, как это:

rch_jwt_user.credential_fetcher: 
    class: RCH\JWTUserBundle\Service\CredentialFetcher 
    arguments: [ "@service_container" ] 

Но многие сообщества пучков использовать setter, а не конструктор.

Так в чем причина этого майор незначительное предупреждение?

Объяснение того, почему и когда мы предпочитаем использовать сеттер, а не передавать контейнер в качестве аргумента в конструкторе (и обратном), будет действительно оценен.

EDIT

В ответ на комментарии:

SLI не заботятся о том, как закачивается контейнер, по-видимому, это плохая практика, чтобы ввести его.

Любая идея альтернативы, совместимой с SLI?

+4

Я не уверен, что проблема заключается в том, как вы вводите инъекции, для меня это выглядит так: «Если вы вводите весь контейнер, вы не являетесь конкретным, какие службы вам нужны». Но я не уверен, потому что сообщение также не ясно. Но, пытаясь ответить на ваш вопрос, я бы сказал, причина в том, что конструктор является сигнатурой класса, используя setter, будет иметь больше смысла! –

+0

По нескольким причинам мне нужно ввести весь контейнер. Моя реализация выглядит как много других, таких как [FOSRestBundle ParamFetcher] (https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Request/ParamFetcher.php). Возможно, мне нужно расширить ContainerAware или реализовать соответствующий интерфейс, я сделаю некоторые попытки, но я действительно не понимаю. – chalasr

+0

Я думаю, что то, что Insight пытается сказать, заключается в том, что вы должны попробовать найти другой способ ввода зависимостей, которые вам нужны в этой службе. Пробовали ли вы модифицировать расширение? – hasumedic

ответ

2

Благодаря помощи @RenatoMendesFigueiredo, @hasumedic & (по большей части) @Cerad, без необходимости премиального плана, я могу видеть суть этого предупреждения и понять его.

На самом деле, давным-давно, я сделал бы свою услугу, расширяя ContainerAware, вместо того, чтобы писать метод напрямую, но вынужден жить с его пределами (услуга не могла расширить другой класс).

В 2.4 добавлен ContainerAwareTrait.

Моя догадка, что предупреждение было добавлено в то же время, как эта черта, потому что:

1) Нет причин, чтобы написать сеттер или конструктор для введения в контейнер, если черта, это сделать уже существует ,

2) Не нужно передавать контейнер в качестве аргумента в другой цели, чем вставлять его в сервис.

Кроме того, я удалил метод setContainer из класса моего сервиса, сделайте его использующим ContainerAwareTrait и сохраните определение службы, как и раньше.

И ...

Kudos

Престижность!

Смежные вопросы