Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP控制器别名_Php_Cakephp_Cakephp 2.2 - Fatal编程技术网

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的思考