3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
13 use Zend\Di\Definition\ArrayDefinition
;
14 use Zend\Di\Definition\RuntimeDefinition
;
15 use Zend\Stdlib\ArrayUtils
;
18 * Configures Di instances
25 protected $data = array();
30 * @param array|Traversable $options
31 * @throws Exception\InvalidArgumentException
33 public function __construct($options)
35 if ($options instanceof Traversable
) {
36 $options = ArrayUtils
::iteratorToArray($options);
39 if (!is_array($options)) {
40 throw new Exception\
InvalidArgumentException(
41 'Config data must be of type Traversable or an array'
44 $this->data
= $options;
53 public function configure(Di
$di)
55 if (isset($this->data
['definition'])) {
56 $this->configureDefinition($di, $this->data
['definition']);
58 if (isset($this->data
['instance'])) {
59 $this->configureInstance($di, $this->data
['instance']);
65 * @param array $definition
67 public function configureDefinition(Di
$di, $definition)
69 foreach ($definition as $definitionType => $definitionData) {
70 switch ($definitionType) {
72 foreach ($definitionData as $filename) {
73 if (is_readable($filename)) {
74 $di->definitions()->addDefinition(new ArrayDefinition(include $filename), false);
79 if (isset($definitionData['enabled']) && !$definitionData['enabled']) {
80 // Remove runtime from definition list if not enabled
81 $definitions = array();
82 foreach ($di->definitions() as $definition) {
83 if (!$definition instanceof RuntimeDefinition
) {
84 $definitions[] = $definition;
87 $definitionList = new DefinitionList($definitions);
88 $di->setDefinitionList($definitionList);
89 } elseif (isset($definitionData['use_annotations']) && $definitionData['use_annotations']) {
90 /* @var $runtimeDefinition Definition\RuntimeDefinition */
91 $runtimeDefinition = $di
93 ->getDefinitionByType('\Zend\Di\Definition\RuntimeDefinition');
94 $runtimeDefinition->getIntrospectionStrategy()->setUseAnnotations(true);
98 foreach ($definitionData as $className => $classData) {
99 $classDefinitions = $di->definitions()->getDefinitionsByType('Zend\Di\Definition\ClassDefinition');
100 foreach ($classDefinitions as $classDefinition) {
101 if (!$classDefinition->hasClass($className)) {
102 unset($classDefinition);
105 if (!isset($classDefinition)) {
106 $classDefinition = new Definition\
ClassDefinition($className);
107 $di->definitions()->addDefinition($classDefinition, false);
109 foreach ($classData as $classDefKey => $classDefData) {
110 switch ($classDefKey) {
112 $classDefinition->setInstantiator($classDefData);
115 $classDefinition->setSupertypes($classDefData);
119 foreach ($classDefData as $methodName => $methodInfo) {
120 if (isset($methodInfo['required'])) {
121 $classDefinition->addMethod($methodName, $methodInfo['required']);
122 unset($methodInfo['required']);
124 foreach ($methodInfo as $paramName => $paramInfo) {
125 $classDefinition->addMethodParameter($methodName, $paramName, $paramInfo);
130 $methodName = $classDefKey;
131 $methodInfo = $classDefData;
132 if (isset($classDefData['required'])) {
133 $classDefinition->addMethod($methodName, $methodInfo['required']);
134 unset($methodInfo['required']);
136 foreach ($methodInfo as $paramName => $paramInfo) {
137 $classDefinition->addMethodParameter($methodName, $paramName, $paramInfo);
147 * Configures a given Di instance
150 * @param $instanceData
152 public function configureInstance(Di
$di, $instanceData)
154 $im = $di->instanceManager();
156 foreach ($instanceData as $target => $data) {
157 switch (strtolower($target)) {
160 foreach ($data as $n => $v) {
161 $im->addAlias($n, $v);
166 foreach ($data as $n => $v) {
168 foreach ($v as $v2) {
169 $im->addTypePreference($n, $v2);
172 $im->addTypePreference($n, $v);
177 foreach ($data as $n => $v) {
181 $im->setParameters($target, $v);
185 $im->setInjections($target, $v);
189 $im->setShared($target, $v);