# Zend_Rest_Route

Die Komponente `Zend_Rest` enthält eine RESTvolle Route für `Zend_Controller_Router_Rewrite`. Diese Route bietet ein standartisiertes Routing Schema das Routinganfragen durch Übersetzung der HTTP Methode und der URI zu einem Modul, Controller und einer Action. Die unten stehende Tabelle bietet eine Übersicht darüber wie Anfragemethoden und URI's geroutet werden.

## Verhalten von Zend_Rest_Route

Methode | URI | Module_Controller::action
--- | --- | ---
`GET` | `/product/ratings/` | `Product_RatingsController::indexAction()`
`GET` | `/product/ratings/:id` | `Product_RatingsController::getAction()`
`POST` | `/product/ratings` | `Product_RatingsController::postAction()`
`PUT` | `/product/ratings/:id` | `Product_RatingsController::putAction()`
`DELETE` | `/product/ratings/:id` | `Product_RatingsController::deleteAction()`
`POST` | `/product/ratings/:id?_method=PUT` | `Product_RatingsController::putAction()`
`POST` | `/product/ratings/:id?_method=DELETE` | `Product_RatingsController::deleteAction()`

## Verwendung von Zend_Rest_Route

Um `Zend_Rest_Route` für eine komplette Anwendung einzuschalten muss diese ohne Konfigurationsparameter erstellt und als Standardroute dem Frontcontroller hinzugefügt werden:

    $front     = Zend_Controller_Front::getInstance();
    $restRoute = new Zend_Rest_Route($front);
    $front->getRouter()->addRoute('default', $restRoute);

Wenn `Zend_Rest_Route` keinem gültigen Modul, Controller oder keiner Action entspricht gibt diese `FALSE` zurück und der Router versucht eine Entsprechung zu finden indem die nächste Route im Router verwendet wird.

Um `Zend_Rest_Route` für spezielle Module einzuschalten muss diese mit einem Array von Modulnamen als 3tes Argument des Constructors erstellt werden:

    $front     = Zend_Controller_Front::getInstance();
    $restRoute = new Zend_Rest_Route($front, array(), array('product'));
    $front->getRouter()->addRoute('rest', $restRoute);

Um `Zend_Rest_Route` für spezielle Controller einzuschalten muss ein Array von Controllernamen als Wert für jedes Modul (Arrayelement) hinzugefügt werden.

    $front     = Zend_Controller_Front::getInstance();
    $restRoute = new Zend_Rest_Route($front, array(), array(
        'product' => array('ratings')
    ));
    $front->getRouter()->addRoute('rest', $restRoute);

## Zend_Rest_Route mit Zend_Config_Ini

Um `Zend_Rest_Route` von einer INI Konfigurationsdatei aus zu verwenden muss man den "route" Typ Parameter verwenden und die Konfigurationsoptionen setzen:

    routes.rest.type = Zend_Rest_Route
    routes.rest.defaults.controller = object
    routes.rest.mod = project,user

Die 'type' Option benennt den RESTvollen Routing Konfigurationstyp. Die 'defaults' Option wird verwendet um gemeinsame Standardmodule zu spezifizieren, und oder Aktionen für die Route. Alle anderen Optionen in der Konfigurationsgruppe werden als RESTvolle Modulnamen behandelt, und deren Werte sind RESTvolle Kontrollernamen. Die beispielhafte Konfiguration definiert `Mod_ProjectController` und `Mod_UserController` als RESTvolle Controller.

Dann ist die `addConfig()` Methode des Rewrite Router Objekts zu verwenden:

    $config = new Zend_Config_Ini('path/to/routes.ini');
    $router = new Zend_Controller_Router_Rewrite();
    $router->addConfig($config, 'routes');

## Zend_Rest_Controller

Um bei der Entwicklung von Controllern zu Hilfe zu sein die mit `Zend_Rest_Route` verwendet werden, müssen die Controller von `Zend_Rest_Controller` erweitert werden. `Zend_Rest_Controller` definiert die 5 am meisten benötigten Operationen für RESTvolle Ressourcen in der Form von abstrakten Actionmethoden.

- `indexAction()` - Sollte einen Index von Ressourcen empfangen und diese mit der View verknüpfen.

- `getAction()` - Sollte eine einzelne Ressource empfangen die von einer URI identifiziert wird und diese mit der Vew verknüpfen.

- `postAction()` - Sollte eine einzelne neue Ressource akzeptieren und dessen Status persistent machen.

- `putAction()` - Sollte eine einzelne Ressource akzeptieren die von einer URI identifiziert wird und dessen Status persistent machen.

- `deleteAction()` - Sollte eine einzelne Ressource löschen die von einer URI identifiziert wird.