開発サイトを Cake 2.0 Beta にアップグレードしていますが、カスタム ルーティングが壊れているようです。以前のサイトでは、url /login が Employees コントローラーの action:login にルーティングされていました。これはルートを設定するコードです:
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 関数が起動されていないことを確認しました。このページは、Employees Login ビューを生成する EmployeesController login() 関数にルーティングする必要があります。
Cake がルーティングを処理する方法の変更を見逃していませんか? ここで問題になる可能性のあるものはありますか?
アップデート:
ルートの順序が重要になることはわかっているので、app/config/routes.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 であり、この状況では呼び出されません。
さらに、これは、ユーザーを実際の /login URL にリダイレクトする EmployeesController の関数です。このリダイレクトまで、すべてが正常に実行されます。
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 ステートメントにもかかわらず、そこに到達するとルーティングされません。
更新: routes.php 内のルートの順序が問題の一部であるようです。/login のルートを上記のように変更しました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) を使用していますが、このルーティングの変更により、データベース プラグインへのルーティングが壊れましたか? 別の問題である場合は、別の質問を作成できます。上記の修正が欠落しているデータソースとは無関係である場合、元の問題は修正されているためです。