2017-08-30 68 views
0

我有項目,這個項目裏面,我有大自己服務,這是巨大的,複雜的用自己的依賴等.. 我想與目的使用此服務創建我在controllers服務,如:的Symfony如何讓容器在我的服務

$myService = $this->container->get('service_from_my_domain'); 

我的問題 - 怎麼我的門面裏我能訪問container服務的依賴。我只知道1種方法 - 在yaml config中將依賴注入到服務中。
但是有沒有另一種方式來做到這一點?像:

$dependency = Container::getInstance()->get('my_dependency_service'); 

我發現this answer,但使用全局變量感覺就像時間倒流......

PS:我不想通過YAML配置注入的依賴(不是構造函數注入,也沒有setter注入),因爲我不需要IoC()。

+0

我發現很多問題與同名,但這一個關於另一個問題,因此請注意之前,將這個問題標記爲重複。 –

+0

我不明白爲什麼你甚至需要容器,如果你不想使用IoC和DI? –

+0

Container :: getInstance()正在使用全局。事實上,如果你想全球訪問容器,那麼你幾乎需要使用全局定義。如果它讓你感覺更好,但它仍然是一個全球性的,就像Laravel那樣稱之爲門面。 – Cerad

回答

0

你可以像這樣

services: 
    kernel.listener.acme_listener: 
      class: Acme\AcmeBundle\EventListener\AcmeListener 
      arguments: 
       - @service_container 
      tags: 
       - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

監聽器

use Symfony\Component\DependencyInjection\Container; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

class AcmeListener 
{ 
    /** 
    * @var Container 
    */ 
    private $container; 

    /** 
    * Constructor 
    * 
    * @param Container $container 
    */ 
    public function __construct(Container $container) 
    { 
     $this->container = $container; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $this->container->... 
    } 
} 
+0

我不想通過yaml配置注入依賴關係。 –

+0

添加service.yml – Robert

+0

我不需要DI。我需要在沒有DI的情況下在我的服務中獲得容器。 –

0

如果你真的想有一個有趣的和做的代碼出軌,你可以做這樣的事情...

創建一個Facade類,必須在應用程序啓動時進行初始化。所以,在app.php,只是行後$kernel = new AppKernel('prod', false);Facade初始化:

$kernel->boot(); 
$container = $kernel->getContainer(); 
\MyBundle\Facade::init($container); 

而且,這裏是爲Facade類代碼:

<?php 

namespace MyBundle; 


use Symfony\Component\DependencyInjection\ContainerInterface; 

class Facade 
{ 
    /** 
    * self|null 
    */ 
    private static $instance = null; 

    /** 
    * ContainerInterface 
    */ 
    private static $myContainer; 

    /** 
    * @param ContainerInterface $container 
    */ 
    private function __construct(ContainerInterface $container) 
    { 
     self::$myContainer = $container; 
    } 

    /** 
    * @param string $serviceId 
    * 
    * @return object 
    * @throws \Exception 
    */ 
    public static function create($serviceId) 
    { 
     if (null === self::$instance) { 
      throw new \Exception("Facade is not instantiated"); 
     } 

     return self::$myContainer->get($serviceId); 
    } 

    /** 
    * @param ContainerInterface $container 
    * 
    * @return null|Facade 
    */ 
    public static function init(ContainerInterface $container) 
    { 
     if (null === self::$instance) { 
      self::$instance = new self($container); 
     } 

     return self::$instance; 
    } 
} 

而且,無論你需要一些服務,爲您打造它是這樣的:

$service = \MyBundle\Facade::create('my_dependency_service');


但是,如果你問我 - 我會創建一個Facade服務,這將有一個容器注入構造函數。 而且你會有一些創建服務的方法(Facade::create($serviceId)),它會向容器詢問給定的服務ID。

相關問題