knuspermagier.de

Ein L und zwei P. Philipp!

Kirby x Laravel x Cannot redeclare e()

Ich hatte über das Problem ja schon einmal berichtet – wenn man Kirby zusammen mit verschiedenen Laravel-Sachen benutzen will, bekommt man oft diese Fehlermeldung:

Fatal error: Cannot redeclare e() (previously declared in vendor/illuminate/support/helpers.php:109) in vendor/getkirby/cms/config/helpers.php on line 130

Das Problem ist, dass sowohl Laravel als auch Kirby ein paar Helper-Funktionen definieren, unter anderem eine, die e heißt. Leider hat Kirby in seiner Deklaration keine function_exists-Abfrage und dadurch explodiert alles. Ich hatte sogar schonmal im Kirby-Discord nachgefragt, warum das so ist – man will hier vermeiden, dass eine Helper-Funktion, von einem random Composer-Package überschrieben wird, das gegebenenfalls etwas komplett anderes macht und damit die Funktionalität der Seite kaputt macht. Fair enough.

Nervig ist es trotzdem.

Man kann die Sache umgehen, in dem man in der public/index.php folgendes ergänzt:

define('KIRBY_HELPER_E', false);

Letztens wollte ich allerdings mal ein paar coole Sachen in mein immer wachsendes Kirby-Projekt hinzufügen, namentlich phpunit, phpstan und phpcs. Natürlich haben all diese Tools das exakt gleiche Problem. Leider lässt es sich nicht so leicht lösen, wie für Kirby, denn die Tools lesen natürlich nicht zuerst die public/index.php ein. Je nachdem gibt es zwar ein paar Optionen, um gewissen Code vorher auszuführen, aber ich fand nichts, was wirklich universell gut klappte.

Zum Glück fand ich jetzt in einem Github-Issue auf das composer-include-files-Plugin aufmerksam wurde. Die Funktion ist sehr übersichtlich: Es sorgt einfach dafür, dass die Dateien, die man in der composer.json angeben kann, als allererstes im Autoloader ausgeführt werden.

Das heißt, ich kann die tolle Konstante für Kirby ganz am Anfang ausführen und auch alle externen Tools, die den Code parsen, verstehen das. Wunderbar.

Damit ist jetzt hoffentlich dieses furchtbare Problem, über das ich immer wieder gestolpert bin, ein für alle Mal gelöst.

Kommentare, Feedback und andere Anmerkungen? Schreib mir eine E-Mail 🤓