Skip to content
This repository has been archived by the owner on Jan 29, 2020. It is now read-only.

Commit

Permalink
Brought ServiceLocator\Generator up-to-date with latest DI container
Browse files Browse the repository at this point in the history
- Required updating Proxy's get() and newInstance() methods
- Required updating DI configuration in GeneratorTest class to follow
  new schema
  • Loading branch information
weierophinney committed Sep 22, 2011
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 17 deletions.
39 changes: 31 additions & 8 deletions src/ServiceLocator/DependencyInjectorProxy.php
Expand Up @@ -36,18 +36,24 @@ public function __construct(DependencyInjector $di)
*/
public function get($name, array $params = array())
{
array_push($this->instanceContext, array('GET', $name));

$im = $this->getInstanceManager();

if ($params) {
if (($fastHash = $im->hasSharedInstanceWithParameters($name, $params, true))) {
array_pop($this->instanceContext);
return $im->getSharedInstanceWithParameters(null, array(), $fastHash);
}
} else {
if ($im->hasSharedInstance($name, $params)) {
array_pop($this->instanceContext);
return $im->getSharedInstance($name, $params);
}
}
return $this->newInstance($name, $params);
$instance = $this->newInstance($name, $params);
array_pop($this->instanceContext);
return $instance;
}

/**
Expand Down Expand Up @@ -127,6 +133,7 @@ public function handleInjectionMethodForObject($class, $method, $params, $alias)
*/
public function newInstance($name, array $params = array(), $isShared = true)
{
// localize dependencies (this also will serve as poka-yoke)
$definition = $this->getDefinition();
$instanceManager = $this->getInstanceManager();

Expand All @@ -138,9 +145,13 @@ public function newInstance($name, array $params = array(), $isShared = true)
$alias = null;
}

array_push($this->instanceContext, array('NEW', $class, $alias));

if (!$definition->hasClass($class)) {
$aliasMsg = ($alias) ? '(specified by alias ' . $alias . ') ' : '';
throw new Exception\ClassNotFoundException('Class ' . $aliasMsg . $class . ' could not be located in provided definition.');
throw new Exception\ClassNotFoundException(
'Class ' . $aliasMsg . $class . ' could not be located in provided definition.'
);
}

$instantiator = $definition->getInstantiator($class);
Expand All @@ -159,21 +170,33 @@ public function newInstance($name, array $params = array(), $isShared = true)
}

if ($injectionMethods) {
$methodMetadata = array();
foreach ($injectionMethods as $injectionMethod) {
$methodMetadata[] = $this->handleInjectionMethodForObject($class, $injectionMethod, $params, $alias);
$this->handleInjectionMethodForObject($object, $injectionMethod, $params, $alias);
}
$object->setMethods($methodMetadata);
}

// Methods for which we have configuration
$iConfig = ($instanceManager->hasAlias($alias) && $instanceManager->hasConfiguration($alias))
? $instanceManager->getConfiguration($alias)
: $instanceManager->getConfiguration(get_class($object));

if ($iConfig['methods']) {
foreach ($iConfig['methods'] as $iConfigMethod => $iConfigMethodParams) {
// skip methods processed by handleInjectionMethodForObject
if (in_array($iConfigMethod, $injectionMethods) && $iConfigMethod !== '__construct') continue;
call_user_func_array(array($object, $iConfigMethod), array_values($iConfigMethodParams));
}
}

if ($isShared) {
if ($params) {
$instanceManager->addSharedInstanceWithParameters($object, $name, $params);
$this->getInstanceManager()->addSharedInstanceWithParameters($object, $name, $params);
} else {
$instanceManager->addSharedInstance($object, $name);
$this->getInstanceManager()->addSharedInstance($object, $name);
}
}


array_pop($this->instanceContext);
return $object;
}
}
19 changes: 10 additions & 9 deletions test/ServiceLocator/GeneratorTest.php
Expand Up @@ -8,7 +8,7 @@
Zend\Di\Definition\Builder,
PHPUnit_Framework_TestCase as TestCase;

class ContainerBuilderTest extends TestCase
class GeneratorTest extends TestCase
{
public $tmpFile = false;

Expand Down Expand Up @@ -70,14 +70,12 @@ public function createDefinitions()
'inspect' => array('inspect'),
'struct' => array('struct'),
),
'properties' => array(
'ZendTest\Di\TestAsset\InspectedClass' => array(
'baz' => 'BAZ',
),
'ZendTest\Di\TestAsset\Struct' => array(
'param1' => 'foo',
),
),
'ZendTest\Di\TestAsset\InspectedClass' => array( 'parameters' => array(
'baz' => 'BAZ',
)),
'ZendTest\Di\TestAsset\Struct' => array( 'parameters' => array(
'param1' => 'foo',
)),
),
);
$configuration = new Configuration($data);
Expand All @@ -93,6 +91,9 @@ public function buildContainerClass($name = 'Application')
$this->assertFileExists($this->tmpFile);
}

/**
* @group one
*/
public function testCreatesContainerClassFromConfiguredDependencyInjector()
{
$this->buildContainerClass();
Expand Down

0 comments on commit 427640f

Please sign in to comment.