Вы можете использовать ZF Zend_Controller_Router_Route . Например, чтобы создать URL-адрес, аналогичный используемому в SO, можно определить собственный маршрут в application.ini следующим образом (при условии, что у вас есть контроллер и действие, называемые вопросами и show соответственно):
resources.router.routes.questions.route = '/questions/:id/:title'
resources.router.routes.questions.type = "Zend_Controller_Router_Route"
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.defaults.id =
resources.router.routes.questions.defaults.title =
resources.router.routes.questions.reqs.id = "\d+"
Имея такой маршрут, в ваших представлениях вы можете сгенерировать URL следующим образом:
<?php echo $this->url(array('id'=>621380,'title' => 'seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo+url+structure
//OR if you really want to have dashes in your title:
<?php echo $this->url(array('id'=>621380,'title' => preg_replace('/\s+/','-','seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo-url-structure
Обратите внимание, что /myapp/public/
находится в сгенерированном URL-адресе, потому что на моем локальном хосте не настроены виртуальные хосты и не внесены какие-либо изменения .htaccess. Также обратите внимание, что вам не нужно иметь уникальный :title
, потому что ваш реальный идентификатор находится в переменной :id
.
В качестве примечания: если вы хотите сделать его немного более удобным для пользователя, было бы лучше, чтобы ваш URL был /question/621380/see-url-structure
, а не /questions/621380/see-url-structure
. Это потому, что под этим URL у вас будет только один вопрос, а не много вопросов. Это можно сделать, просто изменив маршрут на следующий resources.router.routes.questions.route = '/question/:id/:title'
.
EDIT:
А что делать с категориями и товарами, которые есть у вас в вопросе? Итак, я бы определил пользовательский маршрут, но на этот раз, используя Zend_Controller_Router_Route_Regex :
resources.router.routes.questions.route = '/questions/(\d+)-(d+)/(\w*)'
resources.router.routes.questions.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.map.1 = category
resources.router.routes.questions.map.2 = product
resources.router.routes.questions.map.3 = title
resources.router.routes.questions.reverse = "questions/%d-%d/%s"
Будет сгенерирован URL для этого маршрута:
<?php echo $this->url(array('category' => 6213,'product' => 80,'title' => preg_replace('/\s+/', '-', 'seo url structure')),'questions' ); ?>
// results in: /myapp/public/questions/6213-80/seo-url-structure
Надеюсь, это поможет или, по крайней мере, укажет вам правильное направление.