CakePHP:如果帖子不存在则显示404或指示他们更正帖子

时间:2011-06-15 19:02:56

标签: php cakephp

我在CakePHP网站上有以下查看方法,用于显示投资组合项目:

function view ( $id, $slug )    
{   
    $post = $this->Portfolio->read(null, Tiny::reverseTiny($id));

    $this->set(compact('post'));
}

这需要一个网址,例如:http://driz.co.uk/portfolio/3z/Paperview_Magazine

但是http://driz.co.uk/portfolio/3z/也会显示帖子,http://driz.co.uk/portfolio/3z/Fake_Text也会显示!

不仅像http://driz.co.uk/portfolio/Random_Text这样完全虚假的网址只会显示空白屏幕,但仍会使用“查看”视图

1。)我如何确保slug是正确的,并强制除了id之外还在url上附加了一个slug。我已经在一些网站上看到过,例如Forrst,他们只是将用户重定向到正确的帖子,所以如果他们错过了slug或者错误输入它,它只是纠正自己,例如也可以在http://forrst.com/posts/Simple_pure_CSS_tooltip_with_arrow-BkY

访问帖子http://forrst.com/posts/Simple_pure_CSS_tooltip_and_extra_text_added_to_url_arrow-BkY

2.。)如何为http://driz.co.uk/portfolio/Random_Text

等公牛网址显示404

感谢

1 个答案:

答案 0 :(得分:1)

回答1: 您可以通过使用beforeRender, beforeFilterafterFind来实现此目的。这将涉及获取提交的slug,将其传递给您的模型,检查它是否有效,并根据需要执行任何其他逻辑。如果它通过,则显示内容,否则重定向/无论如何。

  

但是http://driz.co.uk/portfolio/3z/也会显示帖子,http://driz.co.uk/portfolio/3z/Fake_Text也会显示!

如果您确定您的view方法只会采用两个参数;你可以这样做:

function view($id, $slug, $bogus=null) {

    if($bogus) {
        $this->cakeError('error404');
    }
    // carry on as normal.
}

基本上,如果有第3个URI段,那么我们可以假设它是 bogus URL(虽然它仍然可以显示,因为你的方法使用$id,所以这不是在我看来,必要

要防止发生portfolio/Random_text,您需要检查参数是否有效 - 因此在您使用$id时,它应该是数字。然后,您应该针对您的数据库进行检查,如果找到结果则显示它,否则不要。

可能还有其他解决方案。

也; IMO可能不值得担心太多。如果有人想要使用URL,那么你最好只使用404,而不是试图解决他们自己的混乱。至少我的2点!