2015-05-20 2 views
10

У меня есть две проблемы с удобными URL-адресами.Zend Framework - настройка удобных URL-адресов с маршрутами и регулярным выражением

Я маршрутизатор настроить следующим образом:

  • Фактический URL является http://www.example.com/course/view-batch/course_id/19
  • Я хочу дружественную URL http://www.example.com/java-training/19

Я установка следующего маршрута в application.ini:

resources.router.routes.viewbatchcourse.route = "/:title/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

Работает перформанс особенно хорошо.

Теперь у меня есть новая страница - которая содержит отзывов для Java

  • Фактический URL является http://www.example.com/course/view-reviews/course_id/19
  • Я хочу дружественную URL http://www.example.com/java-reviews/19

я понимаю, его не представляется возможным, потому что один маршрут уже настроен для соответствия этому формату.

Так что я думал, если его можно использовать регулярное выражение и проверить, содержит ли название «отзывы», затем использовать этот маршрут.

Я пробовал этот подход, но он не работает. Вместо этого он открывает вид-страницу пакета:

resources.router.routes.viewreviews.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.viewreviews.route = "/:title/:course_id" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 
resources.router.routes.viewreviews.reqs.title = "\breviews\b" 

Ближайший я получил это работы

resources.router.routes.viewreviews.route = "/:title/:course_id" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 
resources.router.routes.viewreviews.reqs.title = "reviews" 

Теперь, если я введу URL http://www.example.com/reviews/19, то действие показам обзоры получает называется. Возможно ли проверить, содержит ли название слово «отзывы» - тогда этот маршрут должен быть вызван?


Возвращаясь к моей предыдущей рабочей маршрут для http://www.example.com/java-training/19:

resources.router.routes.viewbatchcourse.route = "/:title/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

Количество 19 является курс идентификатор, который мне нужно в действии, чтобы вытащить детали из базы данных.

Но когда страница отображается, я не хочу, чтобы номер 19 был видимым.

Я просто хочу URL быть http://www.example.com/java-training

Возможно ли это?

ответ

0

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

resources.router.routes.viewbatchcourse.route = "/java-training/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.defaults.title = java-training 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

resources.router.routes.viewreviews.route = "/java-reviews/:course_id/" 
resources.router.routes.viewreviews.defaults.controller = course 
resources.router.routes.viewreviews.defaults.action = view-reviews 
resources.router.routes.viewreviews.defaults.title = java-reviews 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 

За вопрос 2. Как вы его описали, просто нет.

+0

Hey Jeremy - жесткое кодирование - это не вариант, потому что «java-review» предназначен для одного курса java. Будет еще 10 других страниц для других курсов, таких как «php-review» - «python-reviews» и т. Д. - так что почему я искал регулярное выражение, которое просто ищет слова в URL-адресе - Спасибо – Gublooo

+0

Ваш вариант по-прежнему жесткое кодирование - но вы просто жестко кодируете конец. 'route = /: title-reviews /: course_id' и' route = /: title-training /: course_id'. –

0

Re: Q1. Я не тестировал это, но, надеюсь, он указывает вам в том направлении, в котором вы хотите идти.

resources.router.routes.viewreviews.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.viewreviews.route = "(.+)-reviews/(\d+)" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.map.1 = "title" 
resources.router.routes.viewreviews.map.2 = "course_id" 

Re: Q2. Я думаю, вам нужно либо перенаправить пользователя на другой (без параметров) URL-адрес, либо обработать его через javascript. См. Modify the URL without reloading the page.

1

1) Вы можете использовать Route_Regex добиться того, что вы хотите

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 

    $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z]+)-reviews/(\d+)', 
     array(
      'module' => 'default', 
      'controller' => 'course', 
      'action'  => 'view-reviews' 
     ), 
     array(
      1 => 'language', 
      2 => 'course_id', 
     ) 
    ); 
    $router->addRoute('review', $route); 

    $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z]+)-training/(\d+)', 
     array(
      'module' => 'default', 
      'controller' => 'course', 
      'action'  => 'view-batch' 
     ), 
     array(
      1 => 'language', 
      2 => 'course_id', 
     ) 
    ); 
    $router->addRoute('training', $route);   
} 

2) Для второй точки я не могу видеть, как это может быть возможно, как есть.

Одна вещь, которую вы могли бы сделать, хотя это использовать название курса, если у вас есть, чтобы отобразить URL, как:

www.xyz.com/java-training/my-awesome-course-19 
www.xyz.com/java-training/19/my-awesome-course 

Было бы довольно легко, используя маршруты, я выше упоминалось.