REST
Controller sind RESTfull (Representational State Transfer) und können zwischen verschiedenen HTTP-Methoden unterscheiden.
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.