REST

Controller sind RESTfull (Representational State Transfer) und können zwischen verschiedenen HTTP-Methoden unterscheiden.

  1. HTTP-Methoden einschränken
  2. Query-Parameter

HTTP-Methoden einschränken

Indem du für eine do-Methode den Namen der gewünschten HTTP-Methode als zusätzlichen Prefix verwendest, kannst du die HTTP-Methoden, über die diese Controller-Methode aufrufbar ist, entsprechend einschränken. Wird z.B. ein Controller über GET mit dem Befehlspfad /foo aufgerufen, sucht er zuerst die Methode getDoFoo() und falls diese nicht existiert, doFoo().

class ExampleController extends ControllerAdapter {  
    
    public function getDoFoo() {
        // GET
    }    
    
    public function putDoFoo() {
        // PUT
    }
    
    public function doFoo() {
        // POST, DELETE
    }
}

Wenn wir vom Befehlspfad /foo ausgehen, ist in diesem Beispiel getDoFoo() nur über GET, putDoFoo() nur über PUT und doFoo() nur über POST und DELETE aufrufbar.

Für alle anderen Controller-Methoden können die erlaubten HTTP-Methoden über die Annotationen n2n\http\annotation\AnnoGet, n2n\http\annotation\AnnoPut, n2n\http\annotation\AnnoPost und n2n\http\annotation\AnnoDelete definiert werden. Über ControllerAdapter::getRequest()->getMethod() kannst du ausserdem die HTTP-Methode des aktuellen Requests abfragen.

<?php
namespace atusch\controller;

use n2n\http\controller\ControllerAdapter;
use n2n\reflection\annotation\AnnoInit;
use n2n\http\annotation\AnnoGet;
use n2n\http\annotation\AnnoPut;
use n2n\http\Method;

class ExampleController extends ControllerAdapter {  
    private static function _annos(AnnoInit $ai) {
        $ai->m('doFoo', new AnnoGet(), new AnnoPut());
    }
    
    public function doFoo($param) {
        switch ($this->getRequest()->getMethod()) {
            case Method::GET:
                echo 'get: ' . $param;
                break;
            case Method::PUT:
                echo 'put: ' . $param;
                break;
        }
    }    
}

Query-Parameter

Indem du Parameter deiner Controller-Methode mit nachstehenden Typen vermerkst, kannst du dir entsprechende Werte aus der URL- oder Post-Query übergeben lassen.

Parameter-Typ Quelle HTTP-Methoden
n2n\http\controller\ParamQuery URL-Query alle
n2n\http\controller\ParamGet URL-Query GET
n2n\http\controller\ParamPut URL-Query PUT
n2n\http\controller\ParamDelete URL-Query DELETE
n2n\http\controller\ParamPost Post-Query POST

Mit diesen Parameter-Typen lassen sich die HTTP-Methoden, über die eine Controller-Methode aufgerufen werden kann, ebenfalls einschränken. Wenn du für eine Controller-Methode zum Beispiel einen obligatorischen Parameter mit Typ ParamGet definierst, kann sie auch nur über GET-Requests aufgerufen werden.

Beispiel 1

    public function doFoo(ParamGet $param) {
        // code
    }

doFoo() kann nur über GET aufgerufen werden.

Beispiel 2

    public function doFoo(ParamGet $param = null) {
        // code
    }

doFoo() kann über alle HTTP-Methoden aufgerufen werden. $param ist nur bei GET-Requests mit passender URL-Query nicht null.

Beispiel 3

    public function doFoo(ParamQuery $param, ParamPost $param2) {
        // code
    }   

doFoo() kann nur über POST aufgerufen werden. Der Request benötigt einen Parameter "param" in der URL-Query sowie einen Parameter "param2" in der Post-Query.

« Requests delegieren Filter »

comments_title

post_login_to_create

questions_title