2009-07-15 6 views
8

Ich erkunde ein paar PHP-Frameworks und der aktuelle Spitzenreiter ist Kohana.Kann ich Routen in Kohana einrichten, um nur bestimmten HTTP-Methoden (GET/POST/etc) zu entsprechen

Mit einem Rails-Hintergrund habe ich mich an das gewöhnt, was die Rails-Community "RESTful" -Routen nennt. Ein "GET/posts" zeigt also alle Beiträge an und wird von der Index-Methode des Post-Controllers behandelt. Ein "POST/Posts" erstellt ein neues Post-Objekt und wird von einer anderen Methode des Post-Controllers behandelt.

Da der Pfad in diesen beiden Anforderungen identisch ist, muss der Router Entscheidungen basierend auf der HTTP-Methode treffen.

Kann der Router in Kohana dies tun?

Antwort

8

Kohana unterstützt standardmäßig keine RESTful-Routen, aber es gibt ein RESTful-Modul, das Unterstützung dafür hinzufügt. Siehe RESTful wiki für die Verwendung.

Kohana v3.x unterstützt RESTful-Controller direkt. Erweitern Sie einfach anstelle von Controller und die gesamte Route-Aktion wird die Anfrage-Methode sein. (A POST Anfrage würde action_post gezielt werden, etc.)

+0

Ab 3.2 wurde der Controller_REST Controller von Kohana Kern entfernt, da es nicht sehr RESTful war. Siehe: http://forum.kohanaframework.org/discussion/9004/kohanes-rest-controller/p1 – eipark

2

Sie auch diese Zeilen zu Ihrer Steuerung vor() Methode könnten hinzufügen:

if ($this->request->method() == "POST") 
{ 
    $this->request->action("post_".$this->request->action()); 
} 

so GET/Controller/Beiträge von dem action_posts behandelt werden() Methode in Ihrem Controller, während POST/Controller/Posts von der action_post_posts() -Methode behandelt werden.

PS: Der eingebaute in Controller_REST in Kohana

0

Überprüfung der HTTP-Methode im Konstruktor der Klasse fühlt sich an wie ein schlechtes Design zu mir 3.2 entfernt wurde. Wie Rails kann Kohana 3.3 RESTful-Routen im Router (wo sie hingehören) erstellen.

Überprüfen Sie die Dokumentation für Kohana 3.3 Route Filters.

Hier ist ein Beispiel:

Route::set('Posts', 'posts/<id>', array('id' => '\d+')) 
    ->filter(function($route, $params, $request) { 
    $params['action'] = strtolower($request->method()); 
    return $params; 
    }) 
    ->defaults(array(
    'controller' => 'Post', 
)); 
Verwandte Themen