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
Возможно ли это?
Ответы
Ответ 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
Было бы довольно легко использовать маршруты, о которых я упоминал выше.
Ответ 2
для вопроса 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. Как вы его описали, просто нет.
Ответ 3
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-адрес без перезагрузки страницы.