2012-04-29 2 views
1

Мне было интересно, как я буду реализовывать URL-адреса моего сайта, такие как http://mysite.com/ArticleTitleHere, используя zend framework.Zend routes & SEO

Способ, которым я вижу, это реализовать маршрут регулярного выражения, но таким образом zf не сможет сказать, что URL-адрес статьи из регулярных маршрутов module/controller/action или controller/action. Как я могу реализовать такую ​​вещь?

Благодаря

ответ

3

вы можете использовать заполнители для этого в вашем маршруте:

routes.test.route = "/:article" 
routes.test.defaults.module = default 
routes.test.defaults.controller = test 
routes.test.defaults.action = test 
routes.test.defaults.article = "" 

Вы можете получить параметр article в контроллере с помощью $this->_getParam("article"). Остальное (соответствующая записи базы данных по названию статьи) - ваша роль.

Но вы должны добавить что-то вроде url-префикса и/или идентификатора статьи, иначе другие маршруты могут быть не найдены. Поэтому использовать что-то вроде этого намного лучше:

routes.test.route = "/article/:id/:title" 

routes.test.defaults.module = default 
routes.test.defaults.controller = test 
routes.test.defaults.action = test 
routes.test.defaults.article = "" 
routes.test.defaults.id = "" 

Вы можете использовать URL-ViewHelper таким образом, чтобы создать ссылку:

<a href="<?php echo $this->url(array("id" => $article->id, "title" => $article->title), "test"); ?>"><?php echo $this->escape($article->title); ?></a> 

И в контроллере для редиректа:

$this->_helper->redirector->gotoRoute(array("id" => $article->id, "title" => $article->title), "test"); 

Имейте в виду экранирование или фильтрацию $article->title для недопустимых символов (или символов, отличных от ascii).

+0

Спасибо, но с точки зрения SEO 1 глубина уровня лучше, чем 3. Поэтому использование префикса для URL-адреса не решит его. Предположим, что этот сценарий: все запросы перенаправляются в контроллер статьи, если статья с указанным uri не найдена, перенаправление запроса на маршрутизатор снова для перенаправления запроса ... это даже возможно? – Maverick

+0

Поместите этот маршрут как первую запись в свой route.ini (или application.ini, если вы используете его как ресурс), поэтому диспетчер ZF все равно найдет другие маршруты. В лучшем случае вы будете сопоставлять все свои статьи (если нет, отправьте 404 http-код). Если вы все еще хотите снова вызвать диспетчера (для другого маршрута), попробуйте '$ this -> _ request-> setDispatched (false)' или добавьте еще одно действие в стек: '$ this -> _ helper-> actionStack (« действие », «контроллер», «модуль»); « – MonkeyMonkey

+0

Спасибо ... попробуем это и подтвердим ответ, подтвержденный – Maverick