2015-05-20 16 views
10

Tôi có hai vấn đề với URL thân thiện với người dùng.Zend Framework - thiết lập URL thân thiện với người dùng với các tuyến đường và regex

Tôi đã một router thiết lập như sau:

  • URL thực tế là http://www.example.com/course/view-batch/course_id/19
  • Tôi muốn có một URL thân thiện hơn http://www.example.com/java-training/19

tôi đã thiết lập các tuyến đường sau trong 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+" 

Tác phẩm này có hiệu quả ectly tốt.

Bây giờ tôi có một trang mới - trong đó có đánh giá sử dụng cho Java

  • URL thực tế là http://www.example.com/course/view-reviews/course_id/19
  • Tôi muốn có một URL thân thiện hơn http://www.example.com/java-reviews/19

Tôi nhận ra mình không thể vì một tuyến đường đã được thiết lập để khớp với định dạng đó.

Vì vậy, tôi đã suy nghĩ nếu nó có thể sử dụng regex và kiểm tra xem tiêu đề có chứa "đánh giá" sau đó sử dụng tuyến đường này.

Tôi đã thử cách tiếp cận này, nhưng nó không hoạt động. Thay vào đó, nó sẽ mở trang xem hàng loạt:

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" 

Gần nhất tôi đã có này để làm việc là

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" 

Bây giờ nếu tôi nhập URL http://www.example.com/reviews/19, sau đó hành động xem xét được gọi. Có thể - để kiểm tra xem tiêu đề có chứa từ "đánh giá" không - thì tuyến đường này có nên được gọi không?


Trở lại với lộ trình làm việc trước đây của tôi cho 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+" 

Số 19 là id nhiên, mà tôi cần trong hành động để kéo các chi tiết từ cơ sở dữ liệu.

Nhưng khi trang được hiển thị, tôi không muốn hiển thị số 19.

Tôi chỉ muốn URL là http://www.example.com/java-training

Điều này có khả thi không?

Trả lời

0

cho câu hỏi 1. Tôi nghĩ bạn có thể giải quyết vấn đề này khá đơn giản bằng cách thay đổi tuyến đường. Bạn không cần phải có: tiêu đề như là một phần của tuyến đường, thay vào đó nó có thể được mã hóa cứng trong trường hợp của bạn. Tôi muốn giới thiệu cấu hình sau.

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+" 

Đối với câu hỏi 2. Như bạn mô tả, đơn giản là không.

+0

Hey Jeremy - mã hóa cứng không phải là một lựa chọn vì "java-reviews" là cho một khóa học java - sẽ có 10 trang khác cho các khóa học khác như "php-reviews" - "python-reviews" v.v. lý do tại sao tôi đang tìm kiếm một regex mà chỉ cần tìm các đánh giá từ trong URL - Cảm ơn – Gublooo

+0

Tùy chọn của bạn vẫn còn mã hóa cứng - nhưng bạn chỉ cần cứng mã kết thúc. 'route = /: title-reviews /: course_id' và' route = /: title-training /: course_id'. –

0

Re: Q1. Tôi chưa thử nghiệm điều này, nhưng hy vọng nó chỉ cho bạn theo hướng bạn muốn đi.

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. Tôi nghĩ bạn cần chuyển tiếp người dùng đến URL khác (không tham số) hoặc xử lý thông qua javascript. Xem Modify the URL without reloading the page.

1

1) Bạn có thể sử dụng Route_Regex để đạt được những gì bạn muốn

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) Đối với các điểm thứ hai tôi không thể nhìn thấy nó như thế nào có thể có thể như vậy.

Một điều bạn có thể làm dù là sử dụng tên của khóa học, nếu bạn có một, để hiển thị một địa chỉ như:

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

Nó sẽ là khá dễ dàng bằng cách sử dụng các tuyến đường i mentionned ở trên.

Các vấn đề liên quan