CakePHP控制器别名
我知道关于这个主题还有一些其他的话题,但似乎没有一个适合我的需要 我拥有的CakePHP控制器别名,php,cakephp,cakephp-2.2,Php,Cakephp,Cakephp 2.2,我知道关于这个主题还有一些其他的话题,但似乎没有一个适合我的需要 我拥有的 example.com/log/ LogsController.php 我使用了LogsController而不是LogController(复数),因为CakePHP希望您使用复数形式的控制器 但是您可能知道/注意到,example.com/log/将永远不会使用LogsController,因为url中缺少“s” 现在,我想将/log/*重定向到/logs/*。使用以下代码可以很好地工作: Router::con
- example.com/log/
- LogsController.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/时,它说
错误:找不到LogController
问题
因此,我的问题是,如何为我的url设置别名,以便/log/
使用logscoontroller
而不是尝试使用LogController
我还有几个控制器想更改它,比如flight=>flightscoontroller
,profile=>profilescoontroller
看一看。这是关于同一主题,但略有不同。它可能在某些方面对您有所帮助。您只需使用以下方法即可:
class LogsController extends AppController
{
public $name = 'Log';
..... YOUR REMAINING CODE ......
}
您的路由器连接代码将保持不变。请询问它是否对您有效。好的,在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和类出现问题。所以我想我会更喜欢这篇文章中的代码,因为这只是一个别名,而不是一段改变核心的脚本。无论如何,感谢您的帮助。要使用路由进行此操作,正确的方法如下所示
Router::connect('/flight', array('controller'=>'flights','action'=>'index'));
Router::connect('/flight/:action/*', array('controller'=>'flights'));
这告诉路由器,当在URL中找到要使用的操作,但没有找到参数时,默认情况下是使用索引操作。我对所有这些有一个稍微不同的理解。复数通常是处理事情的更准确的方式,但在复数完全错误的情况下,我会在definctor类(/lib/Cake/Utility/definctor)中添加一个异常 在您的示例中,我会将
log
添加到未反映的单词列表中。这意味着系统范围的cake不会附加“s”。您的LogController
视图将位于Log
view文件夹中,等等
编辑
我在app/config/bootstrap.php中找到了一种更简洁的方法
Inflector::rules(
'plural',
array(
'uninflected' => array('log')
)
);
这会将log
添加到未反映的列表中,而无需更改核心中的文件以便于版本更新。阅读本文,更容易告诉cake“flight”是单数和复数。我尝试过,但似乎不起作用。我将FlightsController中的$name更改为'Flight',但当我尝试访问example.com/Flight时,它表示缺少FlightController。否,name变量用于与PHP4的向后兼容性。它不会对路由产生影响,因为控制器在执行路由后加载。但这意味着我将编辑核心中的文件。这是我不想要的。因为我想通过点击按钮来更新蛋糕。所以也许我必须延长课程,但那真的很痛苦。我想有一些很好的方法。当我有时间的时候,我会研究它:)Tnx的思考