Filter

Controller

Filter sind Controller, die vor dem Haupt-Controller ausgeführt werden. Damit lassen sich Web-Applikationen überwachen und beeinflussen.

  1. Filter registrieren
  2. Controlling Plan

Filter registrieren

Filter unterscheiden sich im Aufbau nicht von Haupt-Controllern, jedoch können pro Request mehrere Filter ausgeführt werden. Somit könntest du für denselben Kontextpfad auch mehrere Filter registrieren.

[routing]

filters[] = "/example > atusch\filter\ExampleFilter"
filters[] = "/example > atusch\filter\SomeOtherFilter"

Genau wie Haupt-Controller erweitern Filter üblicherweise n2n\http\controller\ControllerAdapter.

class ExampleFilter extends ControllerAdapter {
    
    public function doFoo(array $params) {
        if ($params[0] == 'baz' && '127.0.0.1' != $this->getRequest()->getRemoteIp()) {
            throw new ForbiddenException();
        }
    }
}

Oben stehender Filter stellt sicher, dass nur von der lokalen Maschine auf http://[url-to-n2n-public]/example/foo/baz/... zugegriffen werden kann.

Controlling Plan

n2n erstellt für jeden Request einen n2n\http\controller\ControllingPlan, auf den du über ControllerAdapter::getControllingPlan() zugreifen kannst. Der Controlling-Plan beinhaltet die Filter und den Haupt-Controller, die für den aktuellen Request ausgeführt werden sollen. Der Controlling-Plan lässt sich zur Laufzeit modifizieren, was besonders in Filtern nützlich sein kann. Über ControllingPlan::abort() kannst du zum Beispiel das Ausführen des Controlling-Plans abbrechen.

Möchtest du zum Beispiel einen Bereich http://[url-to-n2n-public]/secure/... mit einer Zugriffskontrolle schützen, könntest du dafür einen Filter registrieren:

[routing]

filters[] = "/secure/** > atusch\filter\AuthorizationFilter"

Folgendes Beispiel zeigt dir, wie du einen solchen Filter implementieren könntest:

class AuthorizationFilter extends ControllerAdapter {
    
    public function index(LoginContext $loginContext) {
        if ($loginContext->hasUser()) {
            return;
        }
        
        $this->forward('view\login.html', array('loginContext' => $loginContext));
        $this->getControllingPlan()->abort();
    }
}

Dieser Filter überprüft, ob der Benutzer angemeldet ist. Sollte er dies nicht sein, gibt er eine Login-View aus und bricht die Ausführung des Controlling-Plans ab. Der im Beispiel verwendete Typ LoginContext ist fiktiv und müsste selbst erstellt werden.

« REST Subsysteme »

comments_title

post_login_to_create

questions_title