Skip to content

Commit

Permalink
Camelize route prefix when trying to load controller.
Browse files Browse the repository at this point in the history
Fixes #8134
  • Loading branch information
ADmad authored and markstory committed Jan 31, 2016
1 parent 2f0bf24 commit 954c6fd
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/Routing/Filter/ControllerFactoryFilter.php
Expand Up @@ -17,6 +17,7 @@
use Cake\Core\App;
use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;
use Cake\Utility\Inflector;
use ReflectionClass;

/**
Expand Down Expand Up @@ -68,7 +69,15 @@ protected function _getController($request, $response)
$controller = $request->params['controller'];
}
if (!empty($request->params['prefix'])) {
$namespace .= '/' . $request->params['prefix'];
if (strpos('/', $request->params['prefix']) === false) {
$namespace .= '/' . Inflector::camelize($request->params['prefix']);
} else {
$prefixes = array_map(
'Cake\Utility\Inflector::camelize',
explode('/', $request->params['prefix'])
);
$namespace .= '/' . implode('/', $prefixes);
}
}
$firstChar = substr($controller, 0, 1);
if (strpos($controller, '\\') !== false ||
Expand Down
52 changes: 52 additions & 0 deletions tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php
@@ -0,0 +1,52 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.2.1
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Test\TestCase\Routing\Filter;

use Cake\Core\Configure;
use Cake\Event\Event;
use Cake\Network\Request;
use Cake\Network\Response;
use Cake\Routing\Filter\ControllerFactoryFilter;
use Cake\TestSuite\TestCase;

/**
* Controller factory filter test.
*/
class ControllerFactoryFilterTest extends TestCase
{

/**
* testBeforeDispatch
*
* @return void
*/
public function testBeforeDispatch()
{
Configure::write('App.namespace', 'TestApp');

$filter = new ControllerFactoryFilter();

$request = new Request();
$response = new Response();
$request->addParams(['prefix' => 'admin', 'controller' => 'Posts', 'action' => 'index']);
$event = new Event(__CLASS__, $this, compact('request', 'response'));
$filter->beforeDispatch($event);

$this->assertEquals(
'TestApp\Controller\Admin\PostsController',
get_class($event->data['controller'])
);
}
}

0 comments on commit 954c6fd

Please sign in to comment.