3

我正在将开发站点升级到 Cake 2.0 Beta 并且我的自定义路由似乎已损坏。上一个站点将 url /login 路由到了员工控制器 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 中的登录功能甚至从未启动过。该页面应路由到EmployeesController login() 函数,该函数生成Employees 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,在这种情况下不会被调用。

此外,这是来自EmployeesController 的函数,它将用户重定向到实际的/login 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 语句。

更新: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) 进行连接,此路由更改是否破坏了到数据库插件的路由?如果是不同的问题,我可以创建一个单独的问题,因为如果上述修复与丢失的数据源无关,则原始问题已得到修复。

4

3 回答 3

3

我正在将 CakePHP 应用程序升级到 2.1.1 并且遇到了同样的问题。您配置 database.php 设置的方式已更改。您需要像这样指向正确的数据源......

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'port' => '',
    'login' => 'cakeBlog',
    'password' => 'c4k3-rUl3Z',
    'database' => 'cake_blog_tutorial',
    'schema' => '', 
    'prefix' => '',
    'encoding' => ''
);

“驱动程序”已从“驱动程序”更改为“数据源”。我希望这会有所帮助

于 2012-04-23T13:46:58.167 回答
2

不,正如我之前评论过你的,你的路由没问题。检查我的屏幕截图。我有 Cakephp 2.0 Beta,只是用你的代码测试路由到EmployeesController。也许另一个代码破坏了路由序列,也许 Cakephp 2.0 有路由缓存。

截屏

于 2011-08-10T17:00:28.243 回答
0

终于得到了与这个序列的连接,用于 sqlserver:

    public $default = array(
    'datasource' => 'Database/Sqlserver',
    'persistent' => true,
    'host' => 'VPR132989\LOCAL',
    //'login' => 'markvTest',
    //'password' => 'Pa55w0rd',
    'database' => 'blogTutorial',
    'schema' => '',
    'flags' => array(),
    //'encoding' => PDO::SQLSRV_ENCODING_UTF8,
);

我注释掉了登录名和密码以测试 Windows 身份验证。请务必重新启动服务。编码取决于您是否在驱动程序上定义了此变量,并且它似乎是特定于驱动程序的。希望这可以帮助

于 2014-12-30T22:02:50.397 回答