Requests delegieren

Controller

Aktive Controller können den Request an andere Controller delegieren. Dies ermöglicht das Wiederverwenden von Controllern.

  1. Request delegieren
  2. Automatisches Delegieren

Request delegieren

Wenn wir für den nachstehenden ExampleController den Kontextpfad /example registrieren und ihn mit http://[url-to-n2n-public]/example/foo/bar/baz/qux aufrufen, gilt für den Aufruf dieses Controllers der Kontextpfad /example und der Befehlspfad /foo/bar/baz/qux. Der Befehlspfad wird für den Aufruf der Controller-Methoden analysiert. Dieser Request kann der ExampleController mit n2n\http\controller\ControllerAdapter::delegate() nun an einen anderen Controller weiterdelegieren.

class ExampleController extends ControllerAdapter {  
  
    public function doFoo($param, array $delegateParams,
            ExampleDelegateController $exampleDelegateController) {
        if ($param != 'bar') {
            echo 'delegateParams: ' . implode(', ', $delegateParams);
            return;
        }
        
        $this->delegate($exampleDelegateController, 2);
    }
}

doFoo() delegiert in diesem Beispiel den Request an den ExampleDelegateController, ausser $param ist nicht gleich "bar". Der zweite Parameter von delegate() bestimmt wie viele Pfadteile vom Befehlspfad in den Kontextpfad verschoben werden sollen. Im Beispiel sind dies zwei Pfadteile, also gilt für den Aufruf von ExampleDelegateController der Kontextpfad /example/foo/bar und der Befehlspfad /baz/qux. Prinzipiell befinden sich im Kontextpfad also alle Pfadteile, die bereits verarbeitet wurden.

Controller kannst du dir per Dependency Injection übergeben lassen.

Der ExampleDelegateController könnte also folgendermassen aussehen:

class ExampleDelegateController extends ControllerAdapter {
    
    public function doBaz($param) {
        echo 'param: ' . $param;
    }
}

Automatisches Delegieren

Übergibst du n2n\http\controller\ControllerAdapter::delegate() keinen zweiten Parameter, entscheidet delegate() selbst, wie viele Pfadteile vom Befehlspfad in den Kontextpfad verschoben werden sollen. In diesem Fall werden bei  "index"- und "do"-Methoden alle Pfadteile verschoben, für die in der Controller-Methode kein Array-Parameter definiert wurde. Bei Methoden, die mit einem Muster annotiert sind, werden alle Pfadteile verschoben, für die kein Mehrfach-Modifikator definiert wurde.

Beispiel 1

    public function index(array $delegateParams,
            ExampleDelegateController $exampleDelegateController) {
        $this->delegate($exampleDelegateController);
    }

Befehlspfad und Kontextpfad bleiben gleich.

Beispiel 2

    public function index($param, array $delegateParams,
            ExampleDelegateController $exampleDelegateController) {
        $this->delegate($exampleDelegateController);
    }
    
    public function doFoo(array $delegateParams,
            ExampleDelegateController $exampleDelegateController) {
        $this->delegate($exampleDelegateController);
    }

Bei beiden Methoden wird jeweils ein Pfadteil vom Befehlspfad in den Kontextpfad verschoben.

Beispiel 3

    public function doBar($param, $prama2) {
        $this->delegate($this->exampleDelegateController);
    }

Alle drei Pfadteile werden vom Befehlspfad in den Kontextpfad verschoben.

Beispiel 4

class ExampleController extends ControllerAdapter {  
    private static function _annos(AnnoInit $ai) {
        $as->m('foo', AnnosController::PATH, array('pattern' => 'param:*/*+'));
    }
    
    private $exampleDelegateController;
    
    private function _init(ExampleDelegateController $exampleDelegateController) {
        $this->exampleDelegateController = $exampleDelegateController;
    }
    
    public function foo($param) {
        $this->delegate($this->exampleDelegateController);
    }    
}

Ein Pfadteil wird vom Befehlspfad in den Kontextpfad verschoben.

« Fehlerfall REST »

comments_title

post_login_to_create

questions_title