Hallo zusammen, wir nutzen mittlerweile fast ausschließlich Event-Subscriber, um sauber strukturierte Plugins zu schreiben. Die Registrierung der Subscriber erfolgt, wie im Beispiel angegeben, über das Event Enlight_Controller_Front_DispatchLoopStartup: public function install() { //... // Register an early event for our event subscribers $this-\>subscribeEvent( 'Enlight\_Controller\_Front\_DispatchLoopStartup', 'onStartDispatch' ); //... return true; } public function onStartDispatch(Enlight\_Event\_EventArgs $args) { if ($args-\>getRequest()-\>getModuleName() != 'frontend') { return; } //registrations }
Nun ist es so, dass beim Registrieren eines Event-Subscribers meistens geprüft werden muss, ob man sich im frontend/backend/api-Modul befindet (siehe oben). Frontend-Controller werden aber meistens und insbesondere auch innerhalb der Std.-Links OHNE Modul aufgerufen(‘checkout/cart’, …). Zum Zeitpunkt des Events Enlight_Controller_Front_DispatchLoopStartup wird jedoch noch kein Default-Modulname über Enlight_Controller_Dispatcher_Default.php geladen und der Modulname ist leer. Wir behelfen uns aktuell durch folgende Prüfung: private function isNotFrontendEvent(Enlight\_Event\_EventArgs $arguments) { $controller = $arguments-\>getSubject(); $request = $controller-\>Request(); /\* \* the module may be empty, so we have to check if we are in the backend or the api module and if not, \* we'll assume to be in the frontend module \*/ return $request-\>getModuleName() == 'backend' || $request-\>getModuleName() == 'api'; }
Ist das ein akzeptabler Workaround, oder gibt es einen besseren Weg?