Zend 2 – RESTful Request

Ich versuche nun schon seit längerer Zeit mithilfe von \Zend\Http\Request bzw \Zend\Http\PhpEnvironment\Request eine REST fähige Applikation auf die Beine zustellen. Leider habe ich festgestellt, das diese Klasse keine Methode bietet um Daten die mit PUT oder DELETE mitgeliefert werden auszulesen.
Nach ein paar kurzen Recherchen bin ich auf mehrere Posts auf stackoverflow gestoßen, die ähnliche Probleme hatten. (Auch allgemein in PHP z.B. http://stackoverflow.com/questions/2081894/handling-put-delete-arguments-in-php). Dort wurde die Möglichkeit erwähnt durch

<?php parse_str(file_get_contents('php://input'), $data); >

die Parameter auszulesen. Ich habe mir daraufhin eine Klasse geschrieben die im Grunde von der \Zend\Http\PhpEnvironment\Request Klasse erbt (diese befüllt sich bereits im Konstruktor selbst), mit der Erweiterung Daten auch bei PUT und DELETE auszulesen.
<?php
use Zend\Http\PhpEnvironment\Request as ZendRequest;
use Zend\Stdlib\ParametersInterface;
use Zend\Stdlib\Parameters;

/**
 * User: Zelle
 * Date: 18.01.13
 * Time: 21:04
 *
 */
class Request extends ZendRequest{

    private $putParams;
    private $deleteParams;

    /**
     * Erstellt aus den Zend Request Objekt ein eigenes Request Objekt das die moeglichkeit bietet
     * auch bei PUT und DELETE anfragen gesendete Daten auszulesen
     * @use $_SERVER
     * @use $_GET
     * @use $_POST
     * @use php://input
     *
     */
    public function __construct(){
        parent::__construct();
        $data = array();
        parse_str(file_get_contents('php://input'), $data);
        switch($this->method){
            case self::METHOD_PUT;
                $this->putParams = new Parameters($data);
                break;
            case self::METHOD_DELETE:
                $this->deleteParams = new Parameters($data);
                break;
        }
    }

    /**
     * Liefert aus den Put Container die passenden Variablen zurück
     *
     * @param null $name
     * @param null $default
     * @return mixed|null|\Zend\Stdlib\Parameters|\Zend\Stdlib\ParametersInterface
     */
    public function getPut($name = null, $default = null){
        if($this->getMethod() !== self::METHOD_PUT){
            return $default;
        }
        if ($this->putParams === null) {
            $this->putParams = new Parameters();
        }

        if ($name === null) {
            return $this->putParams;
        }

        return $this->putParams->get($name, $default);
    }

    /**
     *
     * @see \Zend\Http\Request setPost
     *
     * @param ParametersInterface $put
     * @return Request
     */
    public function setPut(ParametersInterface $put)
    {
        $this->putParams = $put;
        return $this;
    }

    /**
     * Liefert aus den Put Container die passenden Variablen zurück
     *
     * @param null $name
     * @param null $default
     * @return mixed|null|\Zend\Stdlib\Parameters|\Zend\Stdlib\ParametersInterface
     */
    public function getDelete($name = null, $default = null){
        if($this->getMethod() !== self::METHOD_DELETE){
            return $default;
        }
        if ($this->deleteParams === null) {
            $this->deleteParams = new Parameters();
        }

        if ($name === null) {
            return $this->deleteParams;
        }

        return $this->deleteParams->get($name, $default);
    }

    /**
     *
     * @see \Zend\Http\Request setPost
     *
     * @param ParametersInterface $put
     * @return Request
     */
    public function setDelete(ParametersInterface $put)
    {
        $this->putParams = $put;
        return $this;
    }

}


Diese muss jetzt nur mehr befüllt werden. Dies funktioniert über den ServiceManager in der Modulklasse des jeweiligen Modules. Nun kann im Controller mit $this->getRequest darauf zugegriffen werden oder auch über $this->getServiceLocator()->get(‚Request‘);.
use Zend\ModuleManager\Feature\ConfigProviderInterface,
    Zend\ModuleManager\Feature\ServiceProviderInterface;

class Module implements ConfigProviderInterface, ServiceProviderInterface
{

    /**
     * Expected to return \Zend\ServiceManager\Config object or array to
     * seed such an object.
     *
     * @return array|\Zend\ServiceManager\Config
     */
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Request' => function() {
                    return new \Medinfo\Request\Request();;

                },
            )
        );
    }

Weiters kann durch das Überschreiben des Request Objekts auch im Controller darauf zugegriffen werden

<?php 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Http\Request; 
/**  
* User: Zelle  
* Date: 13.01.13  
* Time: 22:20  
*  
*/  class PatStammApiController extends AbstractActionController {     
public function putAction(){         
$request = $this->getRequest();
$sevlrequest = $this->getServiceLocator()->get('Request');

    }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload CAPTCHA.

Anti-Spam durch WP-SpamShield

Scroll to top