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

Commit

Permalink
Merge branch 'hotfix/4408'
Browse files Browse the repository at this point in the history
  • Loading branch information
weierophinney committed May 6, 2013
160 parents 5058513 + 68f3d6e + f0a44c8 + 921096f + acfe55c + 35c857a + a9dd8d2 + 44d8daf + d1f9e24 + a36339c + 86f0f77 + 7ed9bcc + 754bd9a + c36f6c0 + 3ead99d + be05873 + 34e7aec + 2fcaf1c + 3f9b994 + ea3acc3 + fe35f10 + 45cc91b + aa77760 + 4959b82 + 35e2edb + 7717bd8 + 127fcbd + fc52973 + 528f461 + 8e251cd + d95b25a + 0f89697 + c941b0e + 3dc45ae + 180e140 + 67c3033 + 533cd3e + 29e7718 + 936c9be + 2d11657 + fa66751 + 2b778cc + ba628cd + ff761e1 + 5b64ee3 + 9456811 + 1c2d797 + 46b0d8f + 82264b3 + 39c88ce + cee064b + c303bed + ea247e3 + 1f87514 + 8896fc2 + 313a38d + 42848d4 + 8f5c457 + e035a2a + 544e341 + 467f8b2 + 30bb6f0 + f8cc896 + 2ee0afd + 656f0b0 + 7092cb4 + 5e1b259 + abb3ff8 + 39a873f + b6e6c92 + 83055d8 + 1dd5d72 + 9bc304a + 479b8c7 + 41fab24 + 80aee85 + 3962f1e + 6c6b004 + acb7af7 + 39aca71 + 9d55623 + c2210f2 + 50b7a31 + 327d366 + 00cfdb8 + 77c12db + 4a66170 + 4bd5c7f + 9549d20 + d3a95e2 + 5e04377 + d9da2cf + 1049b39 + 001d281 + ca437e5 + a5cb2da + e2db3b8 + 27f50b4 + 8008d6f + 4a6bead + e2df9ad + 9045ea9 + 0d18a05 + 48cc7df + dc08391 + ceec2bd + c5fc623 + 6335bda + 2a78ec6 + 56c198e + 3fab1eb + 6e15982 + 75f672f + 6efac6a + 7818a15 + fc61f7c + 0f89452 + 4ce1a3e + 8e87de6 + ff8bdbb + 30d8776 + df9df5b + 95173ad + 6f9a231 + b28d0cf + d4be36e + 335a3c1 + 6b736dd + 303ab92 + 4594eeb + 7db8ed5 + fecc97b + 5a47e2a + fdab45c + a4698e4 + 0eb7480 + d73e943 + cda61b2 + f5875b9 + 485d763 + e23536a + 7981849 + 388d6df + b3220c5 + 112a8ed + 9f981d8 + 5d39422 + 7bbeff8 + d9b366d + 2e1a8ce + 6c95b5a + 831b797 + 4a459ec + 18d7a25 + 90f630e + 0c71387 + 2f90b43 + c8deb2c + 4d3a9b8 + ba9be9e commit a7502a7
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 4 deletions.
35 changes: 31 additions & 4 deletions src/AbstractPluginManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,6 @@ protected function createFromFactory($canonicalName, $requestedName)
}

if ($factory instanceof FactoryInterface) {
if ($hasCreationOptions && $factory instanceof MutableCreationOptionsInterface) {
$factory->setCreationOptions($this->creationOptions);
}

$instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName);
} elseif (is_callable($factory)) {
$instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName);
Expand All @@ -217,4 +213,35 @@ protected function createFromFactory($canonicalName, $requestedName)

return $instance;
}

/**
* Create service via callback
*
* @param callable $callable
* @param string $cName
* @param string $rName
* @throws Exception\ServiceNotCreatedException
* @throws Exception\ServiceNotFoundException
* @throws Exception\CircularDependencyFoundException
* @return object
*/
protected function createServiceViaCallback($callable, $cName, $rName)
{
if (is_object($callable)) {
$factory = $callable;
} elseif (is_array($callable)) {
// reset both rewinds and returns the value of the first array element
$factory = reset($callable);
}

if (isset($factory)
&& ($factory instanceof MutableCreationOptionsInterface)
&& is_array($this->creationOptions)
&& !empty($this->creationOptions)
) {
$factory->setCreationOptions($this->creationOptions);
}

return parent::createServiceViaCallback($callable, $cName, $rName);
}
}
57 changes: 57 additions & 0 deletions test/AbstractPluginManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
namespace ZendTest\ServiceManager;

use ReflectionClass;
use ReflectionObject;
use Zend\ServiceManager\Exception;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Config;
Expand All @@ -29,6 +30,14 @@ class AbstractPluginManagerTest extends \PHPUnit_Framework_TestCase
public function setup()
{
$this->serviceManager = new ServiceManager;
$this->pluginManager = new FooPluginManager(new Config(array(
'factories' => array(
'Foo' => 'ZendTest\ServiceManager\TestAsset\FooFactory',
),
'shared' => array(
'Foo' => false,
),
)));
}

public function testSetMultipleCreationOptions()
Expand Down Expand Up @@ -61,4 +70,52 @@ public function testSetMultipleCreationOptions()
$this->assertInstanceOf('ZendTest\ServiceManager\TestAsset\FooFactory', $value['foo']);
$this->assertEquals(array('key2' => 'value2'), $value['foo']->getCreationOptions());
}

public function testAbstractFactoryWithMutableCreationOptions()
{
$creationOptions = array('key1' => 'value1');
$mock = 'ZendTest\ServiceManager\TestAsset\AbstractFactoryWithMutableCreationOptions';
$abstractFactory = $this->getMock($mock, array('setCreationOptions'));
$abstractFactory->expects($this->once())
->method('setCreationOptions')
->with($creationOptions);

$this->pluginManager->addAbstractFactory($abstractFactory);
$instance = $this->pluginManager->get('classnoexists', $creationOptions);
$this->assertTrue(is_object($instance));
}

public function testMutableMethodNeverCalledWithoutCreationOptions()
{
$mock = 'ZendTest\ServiceManager\TestAsset\CallableWithMutableCreationOptions';
$callable = $this->getMock($mock, array('setCreationOptions'));
$callable->expects($this->never())
->method('setCreationOptions');

$ref = new ReflectionObject($this->pluginManager);

$method = $ref->getMethod('createServiceViaCallback');
$method->setAccessible(true);
$method->invoke($this->pluginManager, $callable, 'foo', 'bar');
}

public function testCallableObjectWithMutableCreationOptions()
{
$creationOptions = array('key1' => 'value1');
$mock = 'ZendTest\ServiceManager\TestAsset\CallableWithMutableCreationOptions';
$callable = $this->getMock($mock, array('setCreationOptions'));
$callable->expects($this->once())
->method('setCreationOptions')
->with($creationOptions);

$ref = new ReflectionObject($this->pluginManager);

$property = $ref->getProperty('creationOptions');
$property->setAccessible(true);
$property->setValue($this->pluginManager, $creationOptions);

$method = $ref->getMethod('createServiceViaCallback');
$method->setAccessible(true);
$method->invoke($this->pluginManager, $callable, 'foo', 'bar');
}
}
38 changes: 38 additions & 0 deletions test/TestAsset/AbstractFactoryWithMutableCreationOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace ZendTest\ServiceManager\TestAsset;

use stdClass;
use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\MutableCreationOptionsInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

/**
* implements multiple interface mock
*/
class AbstractFactoryWithMutableCreationOptions implements
AbstractFactoryInterface,
MutableCreationOptionsInterface
{
public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
return true;
}

public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
return new stdClass;
}

public function setCreationOptions(array $options)
{
$this->options = $options;
}
}
30 changes: 30 additions & 0 deletions test/TestAsset/CallableWithMutableCreationOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace ZendTest\ServiceManager\TestAsset;

use stdClass;
use Zend\ServiceManager\MutableCreationOptionsInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

/**
* implements multiple interface invokable object mock
*/
class CallableWithMutableCreationOptions implements MutableCreationOptionsInterface
{
public function setCreationOptions(array $options)
{
$this->options = $options;
}

public function __invoke(ServiceLocatorInterface $serviceLocator, $cName, $rName)
{
return new stdClass;
}
}

0 comments on commit a7502a7

Please sign in to comment.