diff --git a/library/Zend/Mvc/Controller/AbstractConsoleController.php b/library/Zend/Mvc/Controller/AbstractConsoleController.php new file mode 100644 index 00000000000..d62007edbaf --- /dev/null +++ b/library/Zend/Mvc/Controller/AbstractConsoleController.php @@ -0,0 +1,57 @@ +console = $console; + + return $this; + } + + /** + * @return ConsoleAdaper + */ + public function getConsole() + { + return $this->console; + } + + /** + * {@inheritdoc} + */ + public function dispatch(RequestInterface $request, ResponseInterface $response = null) + { + if (! $request instanceof ConsoleRequest) { + throw new InvalidArgumentException(sprintf( + '%s can only dispatch requests in a console environment', + get_called_class() + )); + } + return parent::dispatch($request, $response); + } +} diff --git a/library/Zend/Mvc/Controller/ControllerManager.php b/library/Zend/Mvc/Controller/ControllerManager.php index 3e1d1e62486..bcb40b4c26b 100644 --- a/library/Zend/Mvc/Controller/ControllerManager.php +++ b/library/Zend/Mvc/Controller/ControllerManager.php @@ -80,6 +80,10 @@ public function injectControllerDependencies($controller, ServiceLocatorInterfac } } + if ($controller instanceof AbstractConsoleController) { + $controller->setConsole($parentLocator->get('Console')); + } + if (method_exists($controller, 'setPluginManager')) { $controller->setPluginManager($parentLocator->get('ControllerPluginManager')); } diff --git a/tests/ZendTest/Mvc/Controller/ConsoleControllerTest.php b/tests/ZendTest/Mvc/Controller/ConsoleControllerTest.php new file mode 100644 index 00000000000..fc28452267a --- /dev/null +++ b/tests/ZendTest/Mvc/Controller/ConsoleControllerTest.php @@ -0,0 +1,67 @@ +controller = new TestAsset\ConsoleController(); + $routeMatch = new RouteMatch(array('controller' => 'controller-sample')); + $event = new MvcEvent(); + $event->setRouteMatch($routeMatch); + $this->controller->setEvent($event); + } + + public function testDispatchCorrectRequest() + { + $request = new ConsoleRequest(); + $result = $this->controller->dispatch($request); + + $this->assertNotNull($result); + } + + public function testDispatchIncorrectRequest() + { + $this->setExpectedException('\Zend\Mvc\Exception\InvalidArgumentException'); + + $request = new Request(); + $this->controller->dispatch($request); + } + + public function testGetNoInjectedConsole() + { + $console = $this->controller->getConsole(); + + $this->assertNull($console); + } + + public function testGetInjectedConsole() + { + $consoleAdapter = $this->getMock('\Zend\Console\Adapter\AdapterInterface'); + + $controller = $this->controller->setConsole($consoleAdapter); + $console = $this->controller->getConsole(); + + $this->assertInstanceOf('\Zend\Mvc\Controller\AbstractConsoleController', $controller); + $this->assertInstanceOf('\Zend\Console\Adapter\AdapterInterface', $console); + } +} diff --git a/tests/ZendTest/Mvc/Controller/ControllerManagerTest.php b/tests/ZendTest/Mvc/Controller/ControllerManagerTest.php index 83d98e25ae0..c36e8e9022b 100644 --- a/tests/ZendTest/Mvc/Controller/ControllerManagerTest.php +++ b/tests/ZendTest/Mvc/Controller/ControllerManagerTest.php @@ -15,17 +15,20 @@ use Zend\Mvc\Controller\ControllerManager; use Zend\Mvc\Controller\PluginManager as ControllerPluginManager; use Zend\ServiceManager\ServiceManager; +use Zend\Console\Adapter\Virtual as ConsoleAdapter; class ControllerManagerTest extends TestCase { public function setUp() { $this->events = new EventManager(); + $this->consoleAdapter = new ConsoleAdapter(); $this->sharedEvents = new SharedEventManager; $this->events->setSharedManager($this->sharedEvents); $this->plugins = new ControllerPluginManager(); $this->services = new ServiceManager(); + $this->services->setService('Console', $this->consoleAdapter); $this->services->setService('Zend\ServiceManager\ServiceLocatorInterface', $this->services); $this->services->setService('EventManager', $this->events); $this->services->setService('SharedEventManager', $this->sharedEvents); @@ -51,6 +54,13 @@ public function testInjectControllerDependenciesInjectsExpectedDependencies() $this->assertSame($this->sharedEvents, $events->getSharedManager()); } + public function testInjectControllerDependenciesToConsoleController() + { + $controller = new TestAsset\ConsoleController(); + $this->controllers->injectControllerDependencies($controller, $this->controllers); + $this->assertInstanceOf('Zend\Console\Adapter\AdapterInterface', $controller->getConsole()); + } + public function testInjectControllerDependenciesWillNotOverwriteExistingEventManager() { $events = new EventManager(); diff --git a/tests/ZendTest/Mvc/Controller/TestAsset/ConsoleController.php b/tests/ZendTest/Mvc/Controller/TestAsset/ConsoleController.php new file mode 100644 index 00000000000..f4d47fe7304 --- /dev/null +++ b/tests/ZendTest/Mvc/Controller/TestAsset/ConsoleController.php @@ -0,0 +1,17 @@ +