2014-11-21 2 views
1

services.yml:.Контейнер в конструкции поставщика. Symfony 2,4 *

parameters: 
    uasector.user.abstract_social_network_provider.class: Uasector\UserBundle\UserProvider\AbstractSocialNetworkProvider 

services: 
    uasector_user.uasector_abstract_user_data_service: 
     class: %uasector.user.abstract_social_network_provider.class% 
     arguments: ['@service_container', '%kernel.root_dir%', '%uasector_user.image.upload_directory%', '%uasector_user.image.default_avatar_path%'] 

AbstractSocialNetworkProvider.php:

public function __construct(Container $container, $kernelWebDir, $uploadDir, $defaultAvatarPath) //Container $container, $kernelWebDir, $uploadDir, $defaultAvatarPath 
{ 

} 

Ошибка:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Uasector\UserBundle\UserProvider\AbstractSocialNetworkProvider::__construct() must be an instance of Symfony\Component\DependencyInjection\Container, none given, called in /Users/roman/Development/Sites/uasector.dev/app/cache/dev/appDevDebugProjectContainer.php on line 6117 and defined in /Users/roman/Development/Sites/uasector.dev/src/Uasector/UserBundle/UserProvider/AbstractSocialNetworkProvider.php line 35 

Почему AbstractSocialNetworkProvider::__construct() не принимает Container $container?

Repo!

ответ

1

Контейнер не построен, когда вы строите свой класс. Чтобы влить контейнер, вы должны использовать сеттер, например ..

Ваш класс.

use Symfony\Component\DependencyInjection\ContainerInterface; 

class AcmeClass 
{ 
    ... 

    protected $container; 

    public function __construct(...) 
    { 
     ... 
    } 

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

Ваши услуги.

parameters: 
    uasector.user.abstract_social_network_provider.class: 
      Uasector\UserBundle\UserProvider\AbstractSocialNetworkProvider 
      // Split to 2 lines for readability 

services: 
    uasector_user.uasector_abstract_user_data_service: 
     class: %uasector.user.abstract_social_network_provider.class% 
     arguments: 
      - '%kernel.root_dir%' 
      - '%uasector_user.image.upload_directory%' 
      - '%uasector_user.image.default_avatar_path%' 
     // These are called after construction before before you actually use it 
     calls: 
      - [ setContainer, [ @service_container ]] 

ПРИМЕЧАНИЕ

Это, говорит, что, как правило, лучше (если это вообще возможно), чтобы ввести конкретные услуги, которые вам нужно в вашей службе, с тем чтобы избежать тесно связан с контейнером службы, и это также делает вещи намного более заметными с первого взгляда (т. е. когда вы смотрите на конструкцию определения/__, вы можете видеть, что вводится, а не работать через весь класс, чтобы узнать, что вы вызываете с помощью $this->container->get()) ,

+0

Спасибо! Отличное решение! – RomanGorbatko

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