Я обновляю сайт разработчика до бета-версии Cake 2.0, и моя пользовательская маршрутизация нарушена. Предыдущий сайт перенаправил URL / логин на контроллер Employees, действие: логин. Это код настройки маршрутов:
Router::connect('/login', array('controller' => 'employees', 'action' => 'login'));
Router::connect('/login/*', array('controller' => 'employees', 'action' => 'login'));
Вместо этого я получаю стандартную ошибку, когда Cake не может найти контроллер для страницы:
Error: LoginController could not be found.
Это означает, что он вообще не маршрутизируется; LoginController не должен вызываться и не существует. Я подтвердил, что функция входа в EmployeesController никогда даже не запускается. Страница должна быть перенаправлена в функцию login () EmployeesController, которая генерирует представление Login сотрудников.
Я пропустил изменение в том, как Cake обрабатывает маршрутизацию? Есть ли что-нибудь, что может быть проблемой здесь?
Обновление:
Я знаю, что порядок может иметь значение для маршрутов, поэтому вот точный порядок соответствующих операторов маршрутизатора в app / config / rout.php:
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/', array('controller' => 'pages', 'action' => 'home'));
Router::connect('/login', array('controller' => 'employees', 'action' => 'login'));
Router::connect('/login/*', array('controller' => 'employees', 'action' => 'login'));
Router::connect('/logout', array('controller' => 'employees', 'action' => 'logout'));
Есть еще несколько маршрутов, но все они просто симпатичные URL-адреса, не вызываемые в этой ситуации.
Кроме того, это функция из EmployeesController, которая перенаправляет пользователя на фактический URL / логин URL. Все работает нормально до этого перенаправления:
function doLogin() {
$goto = (isset($this->params['url']['url'])) ? $this->params['url']['url'] : '';
$goto = $goto = str_replace('/','|',$goto);
$goto = $goto = str_replace(':','~',$goto);
if (strpos($goto,'|')===0) $goto = substr($goto,1);
if ($goto) $goto = '/goto:'.$goto;
$this->redirect('/login/'.$goto);
die();
}
Материал $goto
/ str_replace()
- это просто создание URL-адреса для перехода после успешного входа пользователя. Это не используется в этой ситуации, мы просто перенаправлены в / login /
Нужно ли перенаправить другим способом сейчас? Это перенаправление идет по правильному URL, но когда оно там, оно НЕ маршрутизируется, несмотря на правильный оператор router: connect.
Обновление:
Порядок маршрутов в rout.php, кажется, является частью проблемы; Я изменил свой маршрут для / логина, чтобы он был выше require CAKE . 'config' . DS . 'routes.php'
как таковой:
Router::connect('/login', array('controller' => 'employees', 'action' => 'login'));
Router::connect('/login/*', array('controller' => 'employees', 'action' => 'login'));
require CAKE . 'Config' . DS . 'routes.php';
Я подтвердил, что теперь выполняется действие login
из EmployeesController.php
, поэтому их маршрутизация выполняется именно в этой степени.
Однако теперь я получаю следующую ошибку:
Notice (8): Undefined index: datasource [CORE\Cake\Model\ConnectionManager.php, line 252]
Errors Missing Datasource Class
Error: Datasource class was not found.
Это вызвано тем, что я маршрутизируюсь до маршрутов Cake по умолчанию? Я использую плагины базы данных Cake по умолчанию (Sqlserver) для соединения, это изменение маршрутизации нарушило маршрутизацию к плагину базы данных? Если это другая проблема, я могу создать отдельный вопрос, потому что, если вышеуказанное исправление не связано с отсутствующим источником данных, исходная проблема будет исправлена.