2015-05-20 27 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+" 

此作品perf很好。

現在我有一個新的一頁 - 其中包含的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" 

現在,如果我輸入網址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是當然的ID,這是我需要在動作從數據庫中摳細節。

但是當頁面顯示時,我不希望數字19可見。

我只是想要的網址是http://www.example.com/java-training

這可能嗎?

回答

0

問題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

嘿傑里米 - 硬編碼不是一個選項,因爲「java-reviews」是一門課程java - 其他其他課程將有10個其他頁面,如「php-reviews」 - 「python-reviews」等 - 這樣爲什麼我正在尋找一個正則表達式,只是在網址中尋找單詞評論 - 謝謝 – Gublooo

+0

你的選擇仍然是硬編碼 - 但你只是硬編碼結束。 'route = /:title-reviews /:course_id'和'route = /:title-training /:course_id'。 –

0

回覆: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" 

回覆: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)對於第二點我看不出它怎麼可能不變。

有一兩件事你可以做,雖然是使用過程中的名字,如果你有一個,顯示像一個網址:

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

它會使用我在上面mentionned的路線是相當容易的。