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

Commit 89f6ebf

Browse files
committed
Basic v3 compatiility updates
These changes provide basic v3 compability, allowing the tests to at least run (though not pass). In particular: - The `ConfigFactory` was only targeting v2 previously; it's now forwards-compatible with v3. - The `RoutePluginManager` had two issues: - `configure()` had the wrong visibility. - `setInvokableClass()` is a method that changes signature between v2 and v3. Since the logic in the `RoutePluginManager` duplicates that in v3, it was removed. - The EventManager factory, and any tests that were instantiating and injecting an EventManager with a shared event manager, received updates to allow varying instantiation based on version. v2 does not accept a shared manager to the constructor, and requires injection via `setSharedManager()`; v3 requires injection via the constructor, and removes the `setSharedManager()` method entirely.
1 parent 9ecc7a3 commit 89f6ebf

11 files changed

+179
-63
lines changed

src/Router/RoutePluginManager.php

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -97,37 +97,6 @@ public function validatePlugin($plugin)
9797
}
9898
}
9999

100-
/**
101-
* Register an invokable class. (v2)
102-
*
103-
* Create invokable factories + optional aliases for an invokable class.
104-
*
105-
* @param string $name
106-
* @param string $class
107-
* @param bool $shared
108-
* @return self
109-
*/
110-
public function setInvokableClass($name, $class, $shared = null)
111-
{
112-
foreach ($this->createAliasesForInvokables([$name => $class]) as $name => $class) {
113-
$this->setAlias($name, $class);
114-
115-
if (is_bool($shared)) {
116-
$this->setShared($name, $shared);
117-
}
118-
}
119-
120-
foreach ($this->createFactoriesForInvokables([$name => $class]) as $name => $factory) {
121-
$this->setFactory($name, $factory);
122-
123-
if (is_bool($shared)) {
124-
$this->setShared($name, $shared);
125-
}
126-
}
127-
128-
return $this;
129-
}
130-
131100
/**
132101
* Pre-process configuration. (v3)
133102
*
@@ -138,7 +107,7 @@ public function setInvokableClass($name, $class, $shared = null)
138107
* @param array $config
139108
* @return void
140109
*/
141-
protected function configure(array $config)
110+
public function configure(array $config)
142111
{
143112
if (isset($config['invokables']) && ! empty($config['invokables'])) {
144113
$aliases = $this->createAliasesForInvokables($config['invokables']);

src/Service/ConfigFactory.php

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace Zend\Mvc\Service;
1111

12+
use Interop\Container\ContainerInterface;
1213
use Zend\ServiceManager\FactoryInterface;
1314
use Zend\ServiceManager\ServiceLocatorInterface;
1415

@@ -23,15 +24,29 @@ class ConfigFactory implements FactoryInterface
2324
* It then retrieves the config listener from the module manager, and from
2425
* that the merged configuration.
2526
*
26-
* @param ServiceLocatorInterface $serviceLocator
27+
* @param ContainerInterface $container
28+
* @param string $name
29+
* @param null|array $options
2730
* @return array|\Traversable
2831
*/
29-
public function createService(ServiceLocatorInterface $serviceLocator)
32+
public function __invoke(ContainerInterface $container, $name, array $options = null)
3033
{
31-
$mm = $serviceLocator->get('ModuleManager');
32-
$mm->loadModules();
33-
$moduleParams = $mm->getEvent()->getParams();
34-
$config = $moduleParams['configListener']->getMergedConfig(false);
35-
return $config;
34+
$moduleManager = $container->get('ModuleManager');
35+
$moduleManager->loadModules();
36+
$moduleParams = $moduleManager->getEvent()->getParams();
37+
return $moduleParams['configListener']->getMergedConfig(false);
38+
}
39+
40+
/**
41+
* Create and return config instance
42+
*
43+
* For use with zend-servicemanager v2; proxies to __invoke().
44+
*
45+
* @param ServiceLocatorInterface $container
46+
* @return array|\Traversable
47+
*/
48+
public function createService(ServiceLocatorInterface $container)
49+
{
50+
return $this($container, 'config');
3651
}
3752
}

src/Service/DiStrictAbstractServiceFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public function getAllowedServiceNames()
8585
public function __invoke(ContainerInterface $container, $name, array $options = null)
8686
{
8787
if (!isset($this->allowedServiceNames[$name])) {
88-
throw new Exception\InvalidServiceNameException('Service "' . $name . '" is not whitelisted');
88+
throw new Exception\InvalidServiceException('Service "' . $name . '" is not whitelisted');
8989
}
9090

9191
if ($container instanceof AbstractPluginManager) {

src/Service/EventManagerFactory.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace Zend\Mvc\Service;
1111

1212
use Interop\Container\ContainerInterface;
13+
use ReflectionClass;
1314
use Zend\EventManager\EventManager;
1415
use Zend\ServiceManager\FactoryInterface;
1516
use Zend\ServiceManager\ServiceLocatorInterface;
@@ -29,6 +30,14 @@ class EventManagerFactory implements FactoryInterface
2930
*/
3031
public function __invoke(ContainerInterface $container, $name, array $options = null)
3132
{
33+
if ($this->acceptsSharedManagerToConstructor()) {
34+
// zend-eventmanager v3
35+
return new EventManager(
36+
$container->has('SharedEventManager') ? $container->get('SharedEventManager') : null
37+
);
38+
}
39+
40+
// zend-eventmanager v2
3241
$events = new EventManager();
3342

3443
if ($container->has('SharedEventManager')) {
@@ -50,4 +59,19 @@ public function createService(ServiceLocatorInterface $container)
5059
{
5160
return $this($container, EventManager::class);
5261
}
62+
63+
/**
64+
* Does the EventManager accept the shared manager to the constructor?
65+
*
66+
* In zend-eventmanager v3, the EventManager accepts the shared manager
67+
* instance to the constructor *only*, while in v2, it must be injected
68+
* via the setSharedManager() method.
69+
*
70+
* @return bool
71+
*/
72+
private function acceptsSharedManagerToConstructor()
73+
{
74+
$r = new ReflectionClass(EventManager::class);
75+
return ! $r->hasMethod('setSharedManager');
76+
}
5377
}

src/Service/ServiceListenerFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class ServiceListenerFactory implements FactoryInterface
4242
'configuration' => 'config',
4343
'Console' => 'ConsoleAdapter',
4444
'ConsoleDefaultRenderingStrategy' => View\Console\DefaultRenderingStrategy::class,
45+
'ControllerLoader' => 'ControllerManager',
4546
'HttpDefaultRenderingStrategy' => View\Http\DefaultRenderingStrategy::class,
4647
'MiddlewareListener' => 'Zend\Mvc\MiddlewareListener',
4748
'RouteListener' => 'Zend\Mvc\RouteListener',

test/Controller/ActionControllerTest.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace ZendTest\Mvc\Controller;
1111

1212
use PHPUnit_Framework_TestCase as TestCase;
13+
use ReflectionClass;
1314
use Zend\Console\Response as ConsoleResponse;
1415
use Zend\EventManager\EventManager;
1516
use Zend\EventManager\SharedEventManager;
@@ -38,11 +39,29 @@ public function setUp()
3839
$this->controller->setEvent($this->event);
3940

4041
$this->sharedEvents = new SharedEventManager();
41-
$this->events = new EventManager();
42-
$this->events->setSharedManager($this->sharedEvents);
42+
$this->events = $this->createEventManager($this->sharedEvents);
4343
$this->controller->setEventManager($this->events);
4444
}
4545

46+
/**
47+
* Create an event manager instance based on zend-eventmanager version
48+
*
49+
* @param SharedEventManager
50+
* @return EventManager
51+
*/
52+
protected function createEventManager($sharedManager)
53+
{
54+
$r = new ReflectionClass(EventManager::class);
55+
56+
if ($r->hasMethod('setSharedManager')) {
57+
$events = new EventManager();
58+
$events->setSharedManager($sharedManager);
59+
return $events;
60+
}
61+
62+
return new EventManager($sharedManager);
63+
}
64+
4665
public function testDispatchInvokesNotFoundActionWhenNoActionPresentInRouteMatch()
4766
{
4867
$result = $this->controller->dispatch($this->request, $this->response);

test/Controller/ControllerManagerTest.php

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace ZendTest\Mvc\Controller;
1111

1212
use PHPUnit_Framework_TestCase as TestCase;
13+
use ReflectionClass;
1314
use Zend\EventManager\EventManager;
1415
use Zend\EventManager\SharedEventManager;
1516
use Zend\Mvc\Controller\ControllerManager;
@@ -23,8 +24,7 @@ class ControllerManagerTest extends TestCase
2324
public function setUp()
2425
{
2526
$this->sharedEvents = new SharedEventManager;
26-
$this->events = new EventManager();
27-
$this->events->setSharedManager($this->sharedEvents);
27+
$this->events = $this->createEventManager($this->sharedEvents);
2828
$this->consoleAdapter = new ConsoleAdapter();
2929

3030
$this->services = new ServiceManager();
@@ -44,6 +44,25 @@ public function setUp()
4444
$this->controllers = new ControllerManager($this->services);
4545
}
4646

47+
/**
48+
* Create an event manager instance based on zend-eventmanager version
49+
*
50+
* @param SharedEventManager
51+
* @return EventManager
52+
*/
53+
protected function createEventManager($sharedManager)
54+
{
55+
$r = new ReflectionClass(EventManager::class);
56+
57+
if ($r->hasMethod('setSharedManager')) {
58+
$events = new EventManager();
59+
$events->setSharedManager($sharedManager);
60+
return $events;
61+
}
62+
63+
return new EventManager($sharedManager);
64+
}
65+
4766
public function testCanInjectEventManager()
4867
{
4968
$controller = new TestAsset\SampleController();
@@ -99,7 +118,7 @@ public function testCanInjectPluginManager()
99118

100119
public function testInjectEventManagerWillNotOverwriteExistingEventManagerIfItAlreadyHasASharedManager()
101120
{
102-
$events = new EventManager($this->sharedEvents);
121+
$events = $this->createEventManager($this->sharedEvents);
103122
$controller = new TestAsset\SampleController();
104123
$controller->setEventManager($events);
105124

test/Controller/Plugin/ForwardTest.php

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace ZendTest\Mvc\Controller\Plugin;
1111

1212
use PHPUnit_Framework_TestCase as TestCase;
13+
use ReflectionClass;
1314
use stdClass;
1415
use Zend\EventManager\EventManager;
1516
use Zend\EventManager\SharedEventManager;
@@ -50,8 +51,7 @@ class ForwardTest extends TestCase
5051

5152
public function setUp()
5253
{
53-
$eventManager = new EventManager();
54-
$eventManager->setSharedManager(new SharedEventManager());
54+
$eventManager = $this->createEventManager(new SharedEventManager());
5555
$mockApplication = $this->getMock('Zend\Mvc\ApplicationInterface');
5656
$mockApplication->expects($this->any())->method('getEventManager')->will($this->returnValue($eventManager));
5757

@@ -84,9 +84,7 @@ public function setUp()
8484
return new PluginManager($services);
8585
},
8686
'EventManager' => function ($services, $name) {
87-
$eventManager = new EventManager();
88-
$eventManager->setSharedManager($services->get('SharedEventManager'));
89-
return $eventManager;
87+
return $this->createEventManager($services->get('SharedEventManager'));
9088
},
9189
'SharedEventManager' => function ($services, $name) {
9290
return new SharedEventManager();
@@ -109,6 +107,25 @@ public function setUp()
109107
$this->plugin = $plugins->get('forward');
110108
}
111109

110+
/**
111+
* Create an event manager instance based on zend-eventmanager version
112+
*
113+
* @param SharedEventManager
114+
* @return EventManager
115+
*/
116+
protected function createEventManager($sharedManager)
117+
{
118+
$r = new ReflectionClass(EventManager::class);
119+
120+
if ($r->hasMethod('setSharedManager')) {
121+
$events = new EventManager();
122+
$events->setSharedManager($sharedManager);
123+
return $events;
124+
}
125+
126+
return new EventManager($sharedManager);
127+
}
128+
112129
public function testPluginWithoutEventAwareControllerRaisesDomainException()
113130
{
114131
$controller = new UneventfulController();
@@ -172,9 +189,7 @@ public function testDispatchRaisesDomainExceptionIfCircular()
172189
return new PluginManager($services);
173190
},
174191
'EventManager' => function ($services, $name) {
175-
$eventManager = new EventManager();
176-
$eventManager->setSharedManager($services->get('SharedEventManager'));
177-
return $eventManager;
192+
return $this->createEventManager($services->get('SharedEventManager'));
178193
},
179194
'SharedEventManager' => function ($services, $name) {
180195
return new SharedEventManager();
@@ -216,8 +231,7 @@ public function testNonArrayListenerDoesNotRaiseErrorWhenPluginDispatchsRequeste
216231
function ($e) {}
217232
]));
218233
// @codingStandardsIgnoreEnd
219-
$events = new EventManager();
220-
$events->setSharedManager($sharedEvents);
234+
$events = $this->createEventManager($sharedEvents);
221235
$application = $this->getMock('Zend\Mvc\ApplicationInterface');
222236
$application->expects($this->any())->method('getEventManager')->will($this->returnValue($events));
223237
$event = $this->controller->getEvent();

test/Controller/RestfulControllerTest.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace ZendTest\Mvc\Controller;
1111

1212
use PHPUnit_Framework_TestCase as TestCase;
13+
use ReflectionClass;
1314
use ReflectionObject;
1415
use stdClass;
1516
use Zend\EventManager\EventManager;
@@ -40,11 +41,29 @@ public function setUp()
4041
$this->emptyController->setEvent($this->event);
4142

4243
$this->sharedEvents = new SharedEventManager();
43-
$this->events = new EventManager();
44-
$this->events->setSharedManager($this->sharedEvents);
44+
$this->events = $this->createEventManager($this->sharedEvents);
4545
$this->controller->setEventManager($this->events);
4646
}
4747

48+
/**
49+
* Create an event manager instance based on zend-eventmanager version
50+
*
51+
* @param SharedEventManager
52+
* @return EventManager
53+
*/
54+
protected function createEventManager($sharedManager)
55+
{
56+
$r = new ReflectionClass(EventManager::class);
57+
58+
if ($r->hasMethod('setSharedManager')) {
59+
$events = new EventManager();
60+
$events->setSharedManager($sharedManager);
61+
return $events;
62+
}
63+
64+
return new EventManager($sharedManager);
65+
}
66+
4867
public function testDispatchInvokesListWhenNoActionPresentAndNoIdentifierOnGet()
4968
{
5069
$entities = [

0 commit comments

Comments
 (0)