【问题标题】:CakePHP controller aliasCakePHP 控制器别名
【发布时间】:2012-08-09 04:00:56
【问题描述】:

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

我有什么

  • example.com/log/
  • Lo​​gsController.php

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

但您可能知道/注意到,example.com/log/ 永远不会使用 LogsController,因为网址中缺少“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/ 时,它会说

错误:找不到 LogController。

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

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


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

【问题讨论】:

标签: php cakephp cakephp-2.2


【解决方案1】:

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

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

编辑

我在app/config/bootstrap.php 中发现了一种更简洁的方法

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

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

【讨论】:

  • 但这意味着我将在核心中编辑文件。这是我不想要的。因为我希望能够通过单击按钮来更新 Cake。所以也许我必须扩展课程,但这真的很痛苦。我想有一些很好的方法。有时间我会研究的:) Tnx 思考
【解决方案2】:

好的,在 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 和类似的类出现问题。所以我想我会更喜欢这篇文章中的代码,因为这只是一个别名,而不是一个核心更改脚本。无论如何感谢您的帮助。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您可以简单地使用以下方法:

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

      您的路由器连接代码将保持不变。请询问它是否不适合您。

      【讨论】:

      • 我试过这个,但它似乎不起作用。我将 FlightController 中的 $name 更改为“Flight”,但是当我尝试访问 example.com/flight 时,它说 FlightController 丢失了。
      • 不,name 变量是为了向后兼容 PHP4。它不会影响路由,因为控制器是在“执行”路由之后加载的。
      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多