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, тогда вызывается действие view-reviews.
Возможно ли — чтобы проверить, содержит ли заголовок слово «отзывы» — тогда этот маршрут должен быть вызван?


Возвращаясь к моему предыдущему рабочему маршруту для 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

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

10

Решение

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

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

1

Другие решения

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

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

0
По вопросам рекламы [email protected]