<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Di\ServiceLocator; use Zend\Di\Di; use Zend\Di\Exception; /** * Proxy used to analyze how instances are created by a given Di. Overrides Zend\Di\Di to produce artifacts that * represent the process used to instantiate a particular instance */ class DependencyInjectorProxy extends Di { /** * @var Di */ protected $di; /** * @param Di $di */ public function __construct(Di $di) { $this->di = $di; $this->definitions = $di->definitions(); $this->instanceManager = $di->instanceManager(); } /** * {@inheritDoc} * @return GeneratorInstance */ public function get($name, array $params = array()) { return parent::get($name, $params); } /** * {@inheritDoc} * @return GeneratorInstance */ public function newInstance($name, array $params = array(), $isShared = true) { $instance = parent::newInstance($name, $params, $isShared); if ($instance instanceof GeneratorInstance) { /* @var $instance GeneratorInstance */ $instance->setShared($isShared); // When a callback is used, we don't know instance the class name. // That's why we assume $name as the instance alias if (null === $instance->getName()) { $instance->setAlias($name); } } return $instance; } /** * {@inheritDoc} * @return GeneratorInstance */ public function createInstanceViaConstructor($class, $params, $alias = null) { $callParameters = array(); if ($this->di->definitions->hasMethod($class, '__construct') && (count($this->di->definitions->getMethodParameters($class, '__construct')) > 0) ) { $callParameters = $this->resolveMethodParameters($class, '__construct', $params, $alias, true, true); $callParameters = $callParameters ?: array(); } return new GeneratorInstance($class, $alias, '__construct', $callParameters); } /** * {@inheritDoc} * @throws \Zend\Di\Exception\InvalidCallbackException * @return GeneratorInstance */ public function createInstanceViaCallback($callback, $params, $alias) { if (is_string($callback)) { $callback = explode('::', $callback); } if (!is_callable($callback)) { throw new Exception\InvalidCallbackException('An invalid constructor callback was provided'); } if (!is_array($callback) || is_object($callback[0])) { throw new Exception\InvalidCallbackException( 'For purposes of service locator generation, constructor callbacks must refer to static methods only' ); } $class = $callback[0]; $method = $callback[1]; $callParameters = array(); if ($this->di->definitions->hasMethod($class, $method)) { $callParameters = $this->resolveMethodParameters($class, $method, $params, $alias, true, true); } $callParameters = $callParameters ?: array(); return new GeneratorInstance(null, $alias, $callback, $callParameters); } /** * {@inheritDoc} */ public function handleInjectionMethodForObject($class, $method, $params, $alias, $isRequired) { return array( 'method' => $method, 'params' => $this->resolveMethodParameters($class, $method, $params, $alias, $isRequired), ); } /** * {@inheritDoc} */ protected function resolveAndCallInjectionMethodForInstance($instance, $method, $params, $alias, $methodIsRequired, $methodClass = null) { if (!$instance instanceof GeneratorInstance) { return parent::resolveAndCallInjectionMethodForInstance($instance, $method, $params, $alias, $methodIsRequired, $methodClass); } /* @var $instance GeneratorInstance */ $methodClass = $instance->getClass(); $callParameters = $this->resolveMethodParameters($methodClass, $method, $params, $alias, $methodIsRequired); if ($callParameters !== false) { $instance->addMethod(array( 'method' => $method, 'params' => $callParameters, )); return true; } return false; } /** * {@inheritDoc} */ protected function getClass($instance) { if ($instance instanceof GeneratorInstance) { /* @var $instance GeneratorInstance */ return $instance->getClass(); } return parent::getClass($instance); } }