Mapping von HTTP-Parametern
Alle Controller erhalten automatisch alle eingehenden HTTP-Parameter (GET und POST). Die Werte werden anhand des Namens auf die Signatur gemapped. Dabei ist zu beachten, dass die Annotations korrekte Typisierungen enthalten.
/** * @param int $max */ public function index($max) { echo $max; } // admin?max=string // ...gibt 0 aus // admin?max=5 // ...gibt 5 aus
CSRF-Tokens beachten
CSRF-Tokens werden beim Laden einer Seite generiert und werden bei Ajax-POST-Requests automatisch an jeden Request gehängt. Ohne eine gültigen CSRF-Token wird der Execute-Controller nicht ausgeführt. Lesen Sie hier mehr.
Wie kann ich auf Features in anderen Plugins zugreifen?
Um Zugriff auf fremde Plugins zu erhalten bieten die Controller-Abstracts zwei Methoden, die wir nachfolgend näher beschreiben.
Benennung von Requests
Bei Methoden, die per lowerCamelCase
benannt sind, ergibt sich für den HTTP-Request eine Notation die sich an Pfaden orientiert. Hier: lower/camel/case
Wird dies nicht beachtet kommt es womöglich zu Fehlern bei der Verarbeitung von Rollen & Rechten.
getAppFactory()
Mit dieser Methode stellen Sie eine indirekte Verbindung zu einer anderen Controller-Klasse her. Das Objekt wird automatisch instanziiert. Man hat anschließend Zugriff auf alle Methoden dieses Objekts.
/** * @param int $max * @return array */ public function index($max) { return $this ->getAppFactory(ui\lib\request\index::class) ->request($max) ; }
getAppLoose()
// Controller der eine Methode zur Verfügung stellt namespace brandbox\component\foreign { use brandbox\component\http; class engine extends plugin\lib\engineAbstract { public function foreignMethod($max) { return ['max' => $max]; } } } // Controller der Rückgabewert der Methode erweitert namespace brandbox\component\overlay { use brandbox\component\http; class engine extends plugin\lib\engineAbstract { /** * @plugin component/foreign * @priority 100 */ public function foreignMethod($max) { return ['max' => $max, 'min' => 1]; } } }
Aufruf per View
{{{features 'component/foreign.foreign/method' serve}}}
Integration per Controller (Methode)
namespace brandbox\component\example { use brandbox\component\http; use brandbox\component\foreign; class engine extends plugin\lib\engineAbstract { public function initiateLoose($max) { $engine = $this->getAppLoose(foreign\engine::class); $engine->setCallSendRequest(false); $engine->setUseFullChain(true); $engine->setParseHtml(false); $result = $engine->foreignMethod($max); // Gibt beide Werte aus: // $result['serve']['max']; // $result['serve']['min']; } } }
Mit einer losen Kopplung erreichen wir zwei mögliche Ziele:
Hook
Ein Hook kann hilfreich sein, um Funktionen an einer Stelle im Plugin anzureichern, die nicht von diesem Plugin bereitgestellt werden sollen. Hooks werden über den Namen der Methode kenntlich gemacht.
namespace brandbox\component\example { use brandbox\component\http; use brandbox\component\foreign; class engine extends plugin\lib\engineAbstract { public function callHook() { $engine = $this->getAppLoose(self::class); $engine->setCallSendRequest(false); $engine->setUseFullChain(true); $engine->setParseHtml(false); $engine->hookComponentExampleSelfMethod(); } public function hookComponentExampleSelfMethod() {} } }
Verkettung von Responses eines Requests
Es ist möglich, eine Methode zu registrieren, die von anderen Plugins lose überschrieben werden kann. Dadurch ist es möglich eine Sequenz zu erzeugen, die in einer definierten Reihenfolge abgearbeitet wird. Siehe Beispiele weiter oben.