torrentpier-lts/library/Zend/Di/ServiceLocator/DependencyInjectorProxy.php

169 lines
4.9 KiB
PHP

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