2017-08-30 14 views
0

私はプロジェクトを持っていて、このプロジェクトの内部には、自分自身の依存関係を持つ巨大で複雑な大きな独自のサービスがあります... そして、私はを目的以下のようなcontrollersの私のサービス:symfony私のサービスのコンテナを取得する方法

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

私の質問は - 私のファサードの内側に、私は、サービスの依存関係にcontainerへのアクセスを得ることができる方法です。私は1つの方法しか知りません - yaml configのサービスに依存関係を注入することです。
それを行う別の方法はありますか?以下のように:私はthis answerが見つかりましたが、グローバル変数を使用すると、時間の背中のように感じる...

PSまし

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

:私はYAMLの設定による依存性を注入する必要はありません(インジェクションやセッター、コンストラクタ・インジェクションありません)私は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 configを通して依存関係を注入したくありません。 –

+0

service.ymlを追加 – Robert

+0

私はDIは必要ありません。私はDIなしで私のサービスのコンテナを取得する必要があります。 –

0

のように行うことができますあなたは本当に楽しいし、コードの冒険をしたい場合は、あなたがこのような何かを行うことができますが...

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; 
    } 
} 

そして:ここFacadeクラスのコードは、

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

そして:だから、app.phpで、ちょうど行の後$kernel = new AppKernel('prod', false);Facade初期化を行いますそれこの方法:

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


しかし、あなたが私に尋ねるならば、私はコンストラクタにコンテナを注入したFacadeサービスを作ります。 サービス作成のためのメソッド(Facade::create($serviceId))があります。これは、指定されたサービスIDをコンテナに要求します。

関連する問題