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

У меня две проблемы с удобными 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

Это возможно?


person Gublooo    schedule 20.05.2015    source источник


Ответы (3)


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

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

person Alfwed    schedule 28.05.2015

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

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. Как вы это описываете, просто нет.

person Jeremy Giberson    schedule 22.05.2015
comment
Привет, Джереми, жесткое кодирование не вариант, потому что java-reviews для одного курса java - будет еще 10 страниц для других курсов, таких как php-reviews - python-reviews и т. Д. - вот почему я искал регулярное выражение, которое просто ищет слово "отзывы" в URL-адресе - Спасибо - person Gublooo; 23.05.2015
comment
Ваш вариант по-прежнему жесткое кодирование, но вы просто жестко кодируете конец. route = /:title-reviews/:course_id и route = /:title-training/:course_id. - person Jeremy Giberson; 23.05.2015

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. См. Изменение URL без перезагрузки страницы.

person Richard Snazell    schedule 28.05.2015