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

Commit

Permalink
Merge pull request #5469 from snapshotpl/console-controller
Browse files Browse the repository at this point in the history
Abstract console controller
  • Loading branch information
weierophinney committed Jan 3, 2014
2 parents f81d53f + 619ba2f commit 9c60bc4
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 0 deletions.
57 changes: 57 additions & 0 deletions library/Zend/Mvc/Controller/AbstractConsoleController.php
@@ -0,0 +1,57 @@
<?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 Zend\Mvc\Controller;

use Zend\Console\Adapter\AdapterInterface as ConsoleAdaper;
use Zend\Console\Request as ConsoleRequest;
use Zend\Mvc\Exception\InvalidArgumentException;
use Zend\Stdlib\RequestInterface;
use Zend\Stdlib\ResponseInterface;

class AbstractConsoleController extends AbstractActionController
{
/**
* @var ConsoleAdaper
*/
protected $console;

/**
* @param ConsoleAdaper $console
* @return self
*/
public function setConsole(ConsoleAdaper $console)
{
$this->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);
}
}
4 changes: 4 additions & 0 deletions library/Zend/Mvc/Controller/ControllerManager.php
Expand Up @@ -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'));
}
Expand Down
67 changes: 67 additions & 0 deletions tests/ZendTest/Mvc/Controller/ConsoleControllerTest.php
@@ -0,0 +1,67 @@
<?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\Mvc\Controller;

use PHPUnit_Framework_TestCase as TestCase;
use Zend\Console\Request as ConsoleRequest;
use Zend\Http\Request;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;

class ConsoleControllerTest extends TestCase
{
/**
* @var TestAsset\ConsoleController
*/
public $controller;

public function setUp()
{
$this->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);
}
}
10 changes: 10 additions & 0 deletions tests/ZendTest/Mvc/Controller/ControllerManagerTest.php
Expand Up @@ -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);
Expand All @@ -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();
Expand Down
17 changes: 17 additions & 0 deletions tests/ZendTest/Mvc/Controller/TestAsset/ConsoleController.php
@@ -0,0 +1,17 @@
<?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\Mvc\Controller\TestAsset;

use Zend\Mvc\Controller\AbstractConsoleController;

class ConsoleController extends AbstractConsoleController
{

}

0 comments on commit 9c60bc4

Please sign in to comment.