Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'hotfix/2750'

Close #2750
  • Loading branch information...
commit 0e28cfc3714a4f28988a90238eb5537e47dc34e5 2 parents beade08 + 1166130
Matthew Weier O'Phinney weierophinney authored
38 library/Zend/ServiceManager/AbstractPluginManager.php
View
@@ -181,4 +181,42 @@ protected function createFromInvokable($canonicalName, $requestedName)
return $instance;
}
+
+ /**
+ * Attempt to create an instance via a factory class
+ *
+ * Overrides parent implementation by passing $creationOptions to the
+ * constructor, if non-null.
+ *
+ * @param string $canonicalName
+ * @param string $requestedName
+ * @return mixed
+ * @throws Exception\ServiceNotCreatedException If factory is not callable
+ */
+ protected function createFromFactory($canonicalName, $requestedName)
+ {
+ $factory = $this->factories[$canonicalName];
+ if (is_string($factory) && class_exists($factory, true)) {
+ if (null === $this->creationOptions || (is_array($this->creationOptions) && empty($this->creationOptions))) {
+ $factory = new $factory();
+ } else {
+ $factory = new $factory($this->creationOptions);
+ }
+
+ $this->factories[$canonicalName] = $factory;
+ }
+
+ if ($factory instanceof FactoryInterface) {
+ $instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName);
+ } elseif (is_callable($factory)) {
+ $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName);
+ } else {
+ throw new Exception\ServiceNotCreatedException(sprintf(
+ 'While attempting to create %s%s an invalid factory was registered for this instance type.', $canonicalName, ($requestedName ? '(alias: ' . $requestedName . ')' : '')
+ ));
+ }
+
+ return $instance;
+ }
+
}
23 tests/ZendTest/Mvc/Controller/Plugin/TestAsset/SamplePluginFactory.php
View
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @package Zend_Mvc
+ */
+
+namespace ZendTest\Mvc\Controller\Plugin\TestAsset;
+
+use Zend\Mvc\Controller\Plugin\AbstractPlugin;
+use Zend\ServiceManager\FactoryInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class SamplePluginFactory implements FactoryInterface
+{
+ public function createService(ServiceLocatorInterface $serviceLocator)
+ {
+ return new SamplePlugin();
+ }
+}
30 tests/ZendTest/Mvc/Controller/Plugin/TestAsset/SamplePluginWithConstructorFactory.php
View
@@ -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-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @package Zend_Mvc
+ */
+
+namespace ZendTest\Mvc\Controller\Plugin\TestAsset;
+
+use Zend\Mvc\Controller\Plugin\AbstractPlugin;
+use Zend\ServiceManager\FactoryInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class SamplePluginWithConstructorFactory implements FactoryInterface
+{
+ protected $options;
+
+ public function __construct($options)
+ {
+ $this->options = $options;
+ }
+
+ public function createService(ServiceLocatorInterface $serviceLocator)
+ {
+ return new SamplePluginWithConstructor($this->options);
+ }
+}
18 tests/ZendTest/Mvc/Controller/PluginManagerTest.php
View
@@ -71,4 +71,22 @@ public function testGetWithConstrutorAndOptions()
$plugin = $pluginManager->get('samplePlugin', 'foo');
$this->assertEquals($plugin->getBar(), 'foo');
}
+
+ public function testCanCreateByFactory()
+ {
+ $pluginManager = new PluginManager;
+ $pluginManager->setFactory('samplePlugin', 'ZendTest\Mvc\Controller\Plugin\TestAsset\SamplePluginFactory');
+ $plugin = $pluginManager->get('samplePlugin');
+ $this->assertInstanceOf('\ZendTest\Mvc\Controller\Plugin\TestAsset\SamplePlugin', $plugin);
+ }
+
+ public function testCanCreateByFactoryWithConstrutor()
+ {
+ $pluginManager = new PluginManager;
+ $pluginManager->setFactory('samplePlugin', 'ZendTest\Mvc\Controller\Plugin\TestAsset\SamplePluginWithConstructorFactory');
+ $plugin = $pluginManager->get('samplePlugin', 'foo');
+ $this->assertInstanceOf('\ZendTest\Mvc\Controller\Plugin\TestAsset\SamplePluginWithConstructor', $plugin);
+ $this->assertEquals($plugin->getBar(), 'foo');
+ }
+
}
Please sign in to comment.
Something went wrong with that request. Please try again.