Skip to content

Commit

Permalink
Fix issue where abstract or interface controllers
Browse files Browse the repository at this point in the history
would be constructed by Dispatcher.
Tests added.
Fixes #2048
  • Loading branch information
markstory committed Oct 1, 2011
1 parent 115c656 commit 4810518
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/Cake/Routing/Dispatcher.php
Expand Up @@ -159,7 +159,11 @@ protected function _getController($request, $response) {
if (!$ctrlClass) {
return false;
}
return new $ctrlClass($request, $response);
$reflection = new ReflectionClass($ctrlClass);
if ($reflection->isAbstract() || $reflection->isInterface()) {
return false;
}
return $reflection->newInstance($request, $response);
}

/**
Expand Down
43 changes: 43 additions & 0 deletions lib/Cake/Test/Case/Routing/DispatcherTest.php
Expand Up @@ -64,6 +64,14 @@ protected function _invoke(Controller $controller, CakeRequest $request, CakeRes
class MyPluginAppController extends AppController {
}

abstract class DispatcherTestAbstractController extends Controller {
abstract public function index();
}

interface DispatcherTestInterfaceController {
public function index();
}

/**
* MyPluginController class
*
Expand Down Expand Up @@ -680,6 +688,41 @@ public function testMissingController() {
$controller = $Dispatcher->dispatch($url, $response, array('return' => 1));
}

/**
* testMissingControllerInterface method
*
* @expectedException MissingControllerException
* @expectedExceptionMessage Controller class DispatcherTestInterfaceController could not be found.
* @return void
*/
public function testMissingControllerInterface() {
Router::connect('/:controller/:action/*');

$Dispatcher = new TestDispatcher();
Configure::write('App.baseUrl', '/index.php');
$url = new CakeRequest('dispatcher_test_interface/index');
$response = $this->getMock('CakeResponse');

$controller = $Dispatcher->dispatch($url, $response, array('return' => 1));
}

/**
* testMissingControllerInterface method
*
* @expectedException MissingControllerException
* @expectedExceptionMessage Controller class DispatcherTestAbstractController could not be found.
* @return void
*/
public function testMissingControllerAbstract() {
Router::connect('/:controller/:action/*');

$Dispatcher = new TestDispatcher();
Configure::write('App.baseUrl', '/index.php');
$url = new CakeRequest('dispatcher_test_abstract/index');
$response = $this->getMock('CakeResponse');

$controller = $Dispatcher->dispatch($url, $response, array('return' => 1));
}
/**
* testDispatch method
*
Expand Down

0 comments on commit 4810518

Please sign in to comment.