2013-10-06 43 views
0

我试图设置以下路由在CakePHP 2.3:cakePHP路径元素指向缺少控制器操作?

域/新闻/塞

我已经按照时生成正确的cookbook guidelines on routing和路线。我遇到的问题是,当选择链接时,我得到'在NewsController中缺少方法'错误消息。

下面是我配置了什么:

Router::connect(
    '/news/:slug/', 
    array('controller' => 'news', 'action' => 'view'), 
    array(
     'pass' => array('slug'), 
     'slug' => '[^_]+' 
     ) 
    ); 

我传递的塞用正则表达式(不包括下划线的任何字符串)。

这是我在索引页面链接:

 <?php echo $this->Html->link(
      $news['News']['title'], 
      array(
      'controller' => 'news', 
      'action' => 'view', 
      'slug' => $news['News']['slug'] 
      ) 
     ); ?> 

如前所述,正确的网址建成,看起来是这样的:/新闻/测试鼻涕虫新闻故事

但是,当我点击它我得到'NewsController中的失踪方法'错误消息

这是显而易见的,我失踪了,因为我看了这个太长,无法看到它。

谢谢,保罗

+0

我会使用白名单,而不是匹配蛞蝓黑名单。 –

+0

感谢马丁,这是否等于白名单,'[a-zA-Z0-9 _-] +' – Paul

+0

它会的,是的。因为你指定哪些字符*应该*在模式中,而不是哪些字符*不应该是(这可能导致错误,在你忘记黑名单的情况下)。过于谨慎比不谨慎更好。 –

回答

0

如上所述,我发现通过在路由设置中'slug'后面加一个反斜杠,控制器将':slug /'解释为控制器动作。

其中的'doh'时刻。

代码应该是这样的:

Router::connect(
    '/news/:slug', 
    array('controller' => 'news', 'action' => 'view'), 
    array(
     'pass' => array('slug'), 
     'slug' => '[a-zA-Z0-9_-]+' 
     ) 
    ); 
0

你可以试试这个:

<?php 
// Routing code 
Router::connect('/news/:slug/', 
    array(
     'controller' => 'news', 
     'action' => 'view' 
    ), 
    array(
     'slug' => '[a-zA-Z0-9_-]+' 
    ) 
); 
?> 

<?php 
// HTML Link code.  
echo $this->Html->link(
    $news['News']['title'], 
    array(
     'controller' => 'news', 
     'action' => 'view', 
     'slug' => $news['News']['slug'] 
    ) 
); 
?> 

如果它不为你工作,请让我知道:)

感谢

+0

请让我知道它是否适合你? –

+0

谢谢维诺,我试过这个,它没有奏效。但是,我确实发现了这个问题。它与去除'/ news /:slug /'中的反斜杠有关,就是这样。似乎额外的反斜杠导致控制器将slug解释为控制器操作。 – Paul