diff --git a/lib/Cake/Routing/Dispatcher.php b/lib/Cake/Routing/Dispatcher.php index 3acfc71bf..58f093691 100644 --- a/lib/Cake/Routing/Dispatcher.php +++ b/lib/Cake/Routing/Dispatcher.php @@ -159,7 +159,11 @@ class Dispatcher { 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); } /** diff --git a/lib/Cake/Test/Case/Routing/DispatcherTest.php b/lib/Cake/Test/Case/Routing/DispatcherTest.php index d5f4f1d5b..8602909cf 100644 --- a/lib/Cake/Test/Case/Routing/DispatcherTest.php +++ b/lib/Cake/Test/Case/Routing/DispatcherTest.php @@ -64,6 +64,14 @@ class TestDispatcher extends Dispatcher { class MyPluginAppController extends AppController { } +abstract class DispatcherTestAbstractController extends Controller { + abstract public function index(); +} + +interface DispatcherTestInterfaceController { + public function index(); +} + /** * MyPluginController class * @@ -680,6 +688,41 @@ class DispatcherTest extends CakeTestCase { $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 *