CakePHP:路由问题

时间:2012-02-10 19:26:08

标签: cakephp routing cakephp-1.3 routes

所有

我目前正在使用CakePHP彻底改造我当前的新闻网站。我已经或将要将所有当前文章转移到我的新网站,它们将与当前网站具有相同的article_id。但是,我已经意识到以下问题。

我当前的网站使用以下设置作为网址:

http://www.mydomain.com/?c=140&a=4388

c=引用类别ID,a=引用文章ID。我的新设置(CakePHP)我利用了slugs,现在我的文章URL显示为:

http://www.mydomain.com/noticia/this-is-an-article-slug

因为,我注意到,通过webstats,我的许多文章都通过Facebook等其他网站上设置的链接进行访问,我认为创建一个能够解决这个问题的系统/路线至关重要。

这就是我的想法:

  1. 创建一条路径,检测与上述类似的请求
  2. 让路由将a值作为参数传递给我的文章控制器中的重定向功能,例如articleRedirect($article_id)
  3. 然后,此函数将根据传递的slug在数据库中查找$article_id并重定向到新地址(请参阅下面的函数)

    // Function in articles controller to redirect old site's article url to 
    // new websites url format
    
    function articleRedirect($article_id = NULL){
        $this->Article->recursive = -1;
        $slug = $this->Article->findById($article_id);        
        if($slug == NULL){
            $this->Session->setFlash('Article not found');
            $this->redirect('/noticias');
        }else{
            $this->redirect('/noticia/'.$slug['Article']['slug']);
        }
    }
    
  4. 我认为这应该有效。但是,我需要一些严肃的路由帮助。任何人都可以建议我可以使用的路线。

    非常感谢。

2 个答案:

答案 0 :(得分:3)

最简单的方法是重新建模您的网址以保留文章ID。例如:

http://www.example.com/noticia/4388/this-is-an-article-slug

然后你可以创建1个单独的RewriteRule来重写所有旧URL到这个新结构,并使用1 Route将它们路由到你的控制器的动作。这样,只需2行配置即可将旧URL迁移到新URL。您的路线看起来像这样:

Router::connect(
    '/noticia/:article-id/:slug',
    array('controller' => 'noticias', 'action' => 'view'),
    array('pass' => 'article-id'),
    'article-id' => '[0-9]+'
);

这会调用NoticiasController的查看操作,并将文章ID从URL传递给它。您必须添加到.htaccess中的RewriteRule应该看起来像这样(未经测试,但只是为了给你一个指针):

RewriteRule ^/?c=[0-9]+&a=([0-9]+)$ /noticia/$1/

答案 1 :(得分:0)

感谢Oldskool愿意提供帮助。但是,我在实施它时遇到了麻烦。我决定远离使用.htaccess或路由,并选择在app_controller中实现一个函数,它将为我处理它:

在我的app_controller's beforeFilter()中,我添加了以下内容:

//Check old url style as in http://www.bravanews.com/?c=123&a=2345 for redirection
    //to the correct new url style as in http://www.bravanews.com/noticia/news-title-using-slug
    $this->CheckOldUrl();

然后在我的app_controller.php中创建了以下函数:

function CheckOldUrl(){
    preg_match("/\?c=(\w+)\&a=(\w+)/i", $_SERVER['REQUEST_URI'], $matches);
    if(!$matches == NULL){
        $this->redirect('/noticias/articleRedirect/'.$matches[2]);
    }
}

如果旧的url上面的函数将转移到articleRedirect函数,然后该函数将重定向到正确的文档

// Function in articles controller to redirect old site's article url to 
// new websites url format

function articleRedirect($article_id = NULL){
    $this->Article->recursive = -1;
    $slug = $this->Article->findById($article_id);        
    if($slug == NULL){
        $this->Session->setFlash('Article not found');
        $this->redirect('/noticias');
    }else{
        $this->redirect('/noticia/'.$slug['Article']['slug']);
    }
}

这可能不是以这种方式处理此类事情的最佳方式,因为它每次访问我的网站时都会调用该函数,但它对我没有任何重大问题。