CakePHP 控制器别名


CakePHP controller alias

我知道关于这个主题还有其他几个主题,但似乎没有一个适合我的需求。

我有什么

  • example.com/log/
  • 日志控制器.php

我有LogsController而不是LogController(复数),因为 CakePHP 希望您拥有复数的控制器。

但正如您可能知道/注意到的那样,example.com/log/永远不会使用LogsController,因为 url 中缺少"s"。

现在,我想将/log/*重定向到/logs/*。使用以下代码完美运行:

Router::connect ('/log/*', array('controller'=>'logs'));

但是,当我尝试访问example.com/log/actions/foo/bar它似乎不起作用。所以经过一番谷歌搜索,我发现了这个:

Router::connect ('/log/:action/*', array('controller'=>'logs'));

效果很好。但是现在当我尝试再次访问 example.com/log/时,它说

错误:找不到日志控制器。

问题所以我的问题是,如何为我的 url 设置别名,以便/log/使用 LogsController 而不是尝试使用 LogController .

我还有一些控制器,我想在其中更改它,例如flight => FlightsControllerprofile => ProfilesController


看看这个问题。它的主题大致相同,但略有不同。它可能会以某种方式帮助您。

好的,在 IRC 上其他人的帮助下和类似的东西。我发现了以下内容。

组合

Router::connect('/flight/:action/*', array('controller'=>'flights'));
Router::connect('/flight/*', array('controller'=>'flights'));

能解决问题。我以前试过这个,但按其他顺序,如下所示:

Router::connect('/flight/*', array('controller'=>'flights'));
Router::connect('/flight/:action/*', array('controller'=>'flights'));

这行不通。

所以这篇文章中的前 2 行代码为我解决了这个问题。另一个人告诉我,Arun Jain的解决方案不是一个合适的解决方案,因为它也改变了核心中的名称约定。这将导致 FormsHelper 和类似的类出现问题。所以我想我会更喜欢这篇文章中的代码,因为这只是一个别名而不是核心更改脚本。无论如何,感谢您的帮助。

要使用路由执行此操作,正确的方法如下。

Router::connect('/flight', array('controller'=>'flights','action'=>'index'));
Router::connect('/flight/:action/*', array('controller'=>'flights'));

这告诉路由器,当在URL中找到一个操作来使用它时,但没有找到参数,那么默认是使用索引操作。

我对这一切的看法略有不同。 复数通常是更准确的处理方式,但是当复数完全错误时,我会在变形器类(/lib/Cake/Utility/Inflector)中添加一个例外。

在您的示例中,我会将log添加到此uninflected单词列表中。 这意味着系统范围的蛋糕不会附加"s"。您将拥有您的LogController您的视图将位于Log视图文件夹中等......

编辑

我遇到了一种更整洁的方法,可以从内部做到这一点app/config/bootstrap.php

Inflector::rules(
    'plural',
    array(
         'uninflected' => array('log')
    )
);

这将log添加到未变形列表中,而无需更改 Core 中的文件以允许更轻松地进行版本更新。

您可以简单地使用以下方法进行操作:

class LogsController extends AppController
{
public $name = 'Log';
..... YOUR REMAINING CODE ......
}

您的路由器连接代码将保持不变。请询问它是否对您不起作用。