вы можете использовать заполнители для этого в вашем маршруте:
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).
Спасибо, но с точки зрения SEO 1 глубина уровня лучше, чем 3. Поэтому использование префикса для URL-адреса не решит его. Предположим, что этот сценарий: все запросы перенаправляются в контроллер статьи, если статья с указанным uri не найдена, перенаправление запроса на маршрутизатор снова для перенаправления запроса ... это даже возможно? – Maverick
Поместите этот маршрут как первую запись в свой route.ini (или application.ini, если вы используете его как ресурс), поэтому диспетчер ZF все равно найдет другие маршруты. В лучшем случае вы будете сопоставлять все свои статьи (если нет, отправьте 404 http-код). Если вы все еще хотите снова вызвать диспетчера (для другого маршрута), попробуйте '$ this -> _ request-> setDispatched (false)' или добавьте еще одно действие в стек: '$ this -> _ helper-> actionStack (« действие », «контроллер», «модуль»); « – MonkeyMonkey
Спасибо ... попробуем это и подтвердим ответ, подтвержденный – Maverick