2012-04-16 2 views
3

Мы в настоящее время написания модуля в Zend Framework 2.ZF2 зависимостей Injection Алиас и несколько экземпляров

Я имею довольно некоторые проблемы найти документацию по этому вопросу, но знаем, что это возможно.

У меня есть 3 класса в иерархии, которые я бы хотел настроить через инъекцию зависимости. Назовем эти классы; ClassA, ClassB и ClassC.

ClassA содержит массив экземпляров ClassB, а ClassB содержит массив экземпляров ClassC. Каждый экземпляр ClassB должен быть создан с использованием разных параметров. То же самое относится и к ClassC. Параметры для всех 3 классов передаются через конструктор (это также может быть обработано с помощью установщика, если это необходимо).

<?php 
class ClassA { 
    protected $arrClassBInstances = array(); 

    public function __construct($arrClassBInstances) { 
     $this->arrClassBInstances = $arrClassBInstances; 
    } 
} 

class ClassB { 
    protected $arrClassCInstances = array(); 
    protected $someOtherParam = ""; 

    public function __construct($arrClassCInstances, $someOtherParam) { 
     $this->arrClassBInstances = $arrClassCInstances; 
     $this->someOtherParam = $someOtherParam; 

    } 
} 

class ClassC { 
    protected $someParam = ""; 

    public function __construct($someParam) { 
     $this->someParam = $someParam; 
    } 
} 

Таким образом, они являются 2 частями моих вопросов. Во-первых, Как настроить несколько экземпляров одного и того же класса с различными введенными параметрами? Например, несколько экземпляров ClassB каждый с собственным подмножеством экземпляров ClassC. В ZF2 DiC должен быть какой-то псевдоним.

Во-вторых, как я могу вставить массив зависимостей перенастройки в класс. Например, Как я могу вставить массив экземпляров ClassB в ClassA?

Если возможно, пожалуйста, предоставьте мне пример с использованием DiC напрямую и пример достижения этого в секции DI модуля.config.php.

ответ

0

С documentation, я думаю, что это должно работы:

// $event instance of \Zend\Mvc\MvcEvent 
$di = $event->getTarget()->getLocator(); 
$paramsForA = array(
    $di->get('qualified_namespaces_or_di_alias_for_b', array('arrClassCInstances'=>array(
     $di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>1)), 
     $di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>2)), 
    ))), 
    $di->get('qualified_namespaces_or_di_alias_for_b', array('arrClassCInstances'=>array(
     $di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>3)), 
     $di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>4)), 
    ))), 
); 
$classA = $di->get('qualified_namespaces_or_di_alias_for_a', array('arrClassBInstances'=>$paramsForA)); 

Вы Либо использовать DI alias или full qualified namespace в качестве первых параметров $di->get()

0

Я просто написал пост на эту тему. Я лично не использую класс Di или DiC, но, надеюсь, вы обнаружите, что концепции могут быть непосредственно применены к вашему вопросу, особенно в части 2, независимо от того, что вы решили использовать в качестве своего IoCC. http://zendblog.shinymayhem.com/2012/09/using-servicemanager-as-inversion-of.html

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