2014-11-21 42 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

當你構建你的類的容器未建。爲了注入容器,你應該使用一個setter .. ..

你的課。

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 2014-11-22 06:03:33