mirror of
https://github.com/torrentpier/torrentpier-lts.git
synced 2025-03-01 15:21:02 +03:00
169 lines
4.9 KiB
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);
|
||
|
}
|
||
|
}
|