CakePHP控制器别名

时间:2012-08-12 20:18:57

标签: php cakephp cakephp-2.2

我知道有关于这个主题的其他几个主题,但它们似乎不符合我的需要。

我有什么

  • example.com/log /
  • LogsController.php

我有LogsController而不是LogController(复数),因为CakePHP希望你有多个控制器。

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

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

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

但是,当我尝试访问example.com/log/actions/foo/bar时,它似乎无法正常工作。所以经过一些Googeling我发现了这个:

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

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

  

错误:找不到LogController。

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

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


看看this question。它是关于同一主题,但略有不同。它可能会以某种方式帮助你。

4 个答案:

答案 0 :(得分:10)

好的,在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'));

哪个不起作用。

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

答案 1 :(得分:1)

要做到这一点,路由正确的方法如下。

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

这告诉路由器,当在URL中找到一个动作来使用它时,但是没有找到params然后默认是使用索引动作。

答案 2 :(得分:0)

我对这一切略有不同。复数通常是更准确的方式,但是在复数只是明显错误的情况下,我在Inflector类(/ lib / Cake / Utility / Inflector)中添加了一个异常。

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

修改

我在app/config/bootstrap.php

中遇到了一种更简洁的方法
Inflector::rules(
    'plural',
    array(
         'uninflected' => array('log')
    )
);

这会将log添加到未反射的列表中,而无需更改Core中的文件以允许更轻松的版本更新。

答案 3 :(得分:-1)

您只需使用以下命令即可:

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

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