CakePHP: проблемы с маршрутизацией - PullRequest
1 голос
/ 10 февраля 2012

All

В настоящее время я использую CakePHP, чтобы полностью обновить мой текущий сайт NEWS. Я перенесу или перенесу все текущие статьи на мой новый сайт, и они будут принимать те же article_id, что и текущий сайт. Однако я осознал следующую проблему.

Мой текущий сайт использует следующую настройку в качестве URL:

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

c= ссылается на идентификатор категории, а a= ссылается на идентификатор статьи. В моей новой настройке (CakePHP) я использую слагов, и теперь URL-адреса моих статей отображаются как:

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

Поскольку я заметил через веб-статистику, что многие из моих статей доступны через настройки ссылок на других сайтах, таких как 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']);
        }
    }
    

Я думаю, что это должно работать. Однако мне нужна серьезная помощь с маршрутизацией. Может кто-нибудь предложить маршрут, который я могу использовать.

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2012

Самый простой способ - немного смоделировать URL-адрес, чтобы сохранить идентификатор статьи.Например:

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

Затем вы можете создать 1 отдельный RewriteRule, чтобы переписать все старые URL-адреса в эту новую структуру и использовать 1 Route, чтобы направить их к действию вашего контроллера.Таким образом, потребуется всего 2 строки конфигурации для переноса старых URL-адресов на новые.Ваш маршрут будет выглядеть примерно так:

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

Это вызовет действие просмотра вашего NoticiasController и передаст идентификатор статьи из URL-адреса.RewriteRule, который вы должны добавить в свой .htaccess, должен выглядеть примерно так (не проверено, но просто чтобы дать вам указатель):

RewriteRule ^/?c=[0-9]+&a=([0-9]+)$ /noticia/$1/
0 голосов
/ 12 февраля 2012

Спасибо за 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']);
    }
}

Вероятно, это не лучший способ обрабатывать подобные вещи, так как он вызывает эту функцию каждый раз, когда к моему сайту обращаются, но он работает для меня без особых проблем.

...