2015-05-20 17 views
10

Ich habe zwei Probleme mit benutzerfreundlichen URLs.Zend Framework - Einrichten von benutzerfreundlichen URLs mit Routen und Regex

Ich habe einen Router wie folgt festgelegt:

  • Die tatsächliche URL http://www.example.com/course/view-batch/course_id/19
  • ist ich eine freundlichere URL wollen http://www.example.com/java-training/19

Ich habe Setup die folgende Route in 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+" 

Dies funktioniert Perf gut.

Jetzt habe ich eine neue Seite - die

lesen für Java enthält
  • Die tatsächliche URL http://www.example.com/course/view-reviews/course_id/19
  • ist ich ein freundlicher URL http://www.example.com/java-reviews/19

Ich weiß, es ist nicht möglich wollen, weil ein Die Route ist bereits so eingerichtet, dass sie diesem Format entspricht.

So dachte ich, wenn es möglich ist, Regex zu verwenden und zu überprüfen, ob Titel "Bewertungen" enthält, dann diese Route verwenden.

Ich habe diesen Ansatz versucht, aber es funktioniert nicht. Stattdessen öffnet sie den Blick Batch-Seite:

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" 

Der nächstgelegene ich diese an die Arbeit bekommen haben ist

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" 

Nun, wenn ich die URL http://www.example.com/reviews/19, dann ist die Ansicht-Bewertungen Aktion aufgerufen wird, ein. Ist es möglich - zu überprüfen, ob der Titel das Wort "Bewertungen" enthält - dann sollte diese Route aufgerufen werden?


Gehen wir zurück zu meiner früheren Arbeits Route für 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+" 

Die Zahl 19 ist der Kurs-ID, die ich in der Aktion müssen die Details aus der Datenbank zu ziehen.

Aber wenn die Seite angezeigt wird, möchte ich nicht die Nummer 19 sichtbar.

Ich will nur die URL http://www.example.com/java-training

Ist das möglich sein?

Antwort

0

für Frage 1. Ich denke, dass Sie dieses Problem ganz einfach lösen können, indem Sie die Route ändern. Sie brauchen nicht: Titel als Teil der Route, stattdessen kann es in Ihrem Fall fest codiert sein. Ich würde die folgende Konfiguration empfehlen.

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

Für Frage 2. Wie Sie es beschreiben, einfach Nein.

+0

Hey Jeremy - harte Codierung ist keine Option, weil "java-reviews" für einen Kurs java ist - es wird 10 andere Seiten für andere Kurse wie "php-reviews" - "python-reviews" usw. geben - also das Warum suchte ich nach einer Regex, die nur nach dem Wort Bewertungen in der URL sucht - Danke – Gublooo

+0

Ihre Option ist immer noch hart codieren - aber Sie nur hart das Ende programmieren. 'route = /: title-reviews /: course_id' und' route = /: title-training /: course_id'. –

0

Betreff: Q1. Ich habe das nicht getestet, aber hoffentlich zeigt es dich in die Richtung, in die du gehen willst.

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" 

Betreff: Q2. Ich denke, dass Sie den Benutzer entweder zu einer anderen (parameterless) URL weiterleiten oder mit Javascript behandeln müssen. Siehe Modify the URL without reloading the page.

1

1) Sie Route_Regex verwenden können, um zu erreichen, was Sie

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) Für den zweiten Punkt möchte ich nicht sehen kann, wie es möglich sein kann, wie es ist.

Eine Sache, Sie aber tun können, ist den Namen des Kurses zu verwenden, wenn Sie eine haben, wie eine URL anzuzeigen:

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

Es wäre ziemlich einfach, die Routen mit i oben erwähnt.