Umstellung auf Namespaces - Datensammlung | Info | Diskussion #40
Replies: 6 comments 1 reply
-
Ich finde das Thema auch sehr Interessant. Für Slack hatte ich ein kleine Einführung zum Thema Namespaces in Redaxo geschrieben, in der (für Einsteiger) erklärt wird, wie was funktioniert und warum. Hab dann gemerkt, dass es zu viel Text ist und jetzt liegt es herum. Falls also Interesse besteht, kann ich das gerne teilen. Wenn man NS einführt, sollte man gleich einen verpflichtenden Standard einführen um zukünftig nicht wieder vor einer Situation zu stehen, wo einem das "jeder kann es machen wie er möchte" auf die Füsse fallen kann. Würde aber an dem Punkt die Frage in den Raum stellen, ob es Addons für Addons gibt und ob das 1 von 200 ist oder ob das auch häufiger vorkommen kann. Den Package Namen würde ich dann auf addon_package ändern. Beispiel: Ich habe aktuell den Fall eines Addons, welches in dem Core-Package nur die Logik enthält. Um das Addon nutzen zu können, muss man (aktuell) eines von 3 Plugins installieren. Plugins sollen aber zukünftig entfallen, weshalb ich das als eigenständige Addons Programmierer, welche das Core Addon als Voraussetzung haben.
Zudem hätte die Struktur auch den Vorteil, dass man schon am Namespace erkennt, worum es sich handelt.
Der package_name in der .yml wäre dann z.B: In der Liste des Installer könnten Main-Addons und Erweiterungen basierend auf dem Namespace angezeigt werden.
|
Beta Was this translation helpful? Give feedback.
-
Ich hab oben im Text noch den Link auf den FOR-Trick ergänzt:
|
Beta Was this translation helpful? Give feedback.
-
Als Antwort: Der Standard hat sich aus den bisherigen Diskussionen m.E. und wie oben dokumemntiert herausgestellt und wid ja auch schon so benutzt bei der Umstellung.
Der Bezug ist gegeben. Einseseits der Name des GitHub-Repo (z.B. yform_adminer) der auch der Package-Name. Im Namespace schreibt er sich dann YformAdminer. Ob sich die Package-Namen und Repo-Namen mal ändern oder ob das überhaupt nötig ist, scheint absehbar egal zu sein. |
Beta Was this translation helpful? Give feedback.
-
Was meinst Du damit? Ein Addon wie yform_adminer oder yform_fields, die Zusatz-Features für YForm bieten. Ja, ei zusätzliches YForm-Value oder Validate in denYForm-NS zu hängen klingt erstmal charmant, kollidiert aber mit der von Gregor kommunizierten Mapping-Strategie für Klassen-Dateien: |
Beta Was this translation helpful? Give feedback.
-
Hm, der eine so der andere anders. Imho ist |
Beta Was this translation helpful? Give feedback.
-
Ich ergänze die Beispiele für bereits umgestellte AddOns, die wir in den letzten Tagen sammelten: REDAXO AddOn Security (boot) REDAXO AddOn MarkItUp! (boot und update) REDAXO AddOn d2u_helper (BackendHelper.php) REDAXO AddOn Quick Navigation (boot, weitere siehe Repository) |
Beta Was this translation helpful? Give feedback.
-
Redaxo-Addons und Namespaces
Das Thema kommt immer mal wieder hoch, gerne im Zusammenhang mit der Umstellung der Installer-Logik auf Composer. Ich versuche mal eine Zusammenfassung und ein paar weitere Gedanken an dieser Stelle zu sammeln. Dann haben wir endlich mal einen Topf, auf den man referenzieren kann.
Bitte gerne erweitern. Das ist nur ein erster Aufschlag.
Stand der Diskussion aus Slack
(Auszüge aus Treads; gesucht am 30.01.2024; Links zu den Threads schenke ich mir, funktionieren in ein paar Wochen eh nicht mehr)
Thread vom Dezember 2022
Namespace: Mein Vorschlag
namespace FriendsOfREDAXO/AddOnName
z.B. in Falle von2factor_auth' habe ich
TwoFactorAuth` genommen.... Nur falls jemand an den AddOns dran ist - dann kann man das zusätzlich noch anpassen
Thread vom 25.01.2024
Thread vom 26.01.2024
Thomas Blum auf GitHub
Quelle
Der Namespace sollte nach dem Schema
FriendsOfRedaxo\[PaketNameWithoutSpacesAndAsCamelCase]
sein. Das hatten wir erst kürzlich als Empfehlung notiert. Wäre hier dann FriendsOfRedaxo\Focuspoint
Das werden wir aber auch noch kommunizieren.
Thread vom 02.02.2024
TobiasKrais/D2uHelper
oder hier wohl eherTobiasKrais/D2UHelper
FriendsOfRedaxo\2FactorAuth
wäre korrekt. Unterstriche sollten im Namespace nicht vorkommen aus meiner Sichtuse rex_finder;' oder
\rex_finder::…`aber da bin ich selbst nicht sicher, was ich besser finde
\rex
einuse rex;
+rex
Das bedeutet ....
Namespaces sind noch nicht Pflicht, aber dringend(!) angeraten. Namespaces an sich sind in PHP "ein alter Hut"
Referenz ist PSR4
Namensschema:
«publischer»\«addon»
; für FOR-Addons alsoFriendsOfRedaxo\«addonname»
oder für andereIgorSeinRepo\«addonname»
Der Addon-Name und eventuelle Sub-Namespaces im Addon werden in der Form "PaketNameWithoutSpacesAndAsCamelCase" geschrieben, also z.B.
FriendsOfRedaxo\YFormAdminer
oderFriendsOfRedaxo\Geolocation\Calc
und immer mit einem Großbuchstaben beginnend.Auch Klassennamen mit Großbuchstaben beginnen und camelCase verwenden (z.B.
FriendsOfRedaxo\Geolocation\Mapset::get(..)
Bei den Namen nicht zu viele Großbuchstaben hintereinander (statt
HTMLHelper
besserHtmlHelper
)Wichtig sind die Namespaces für den Autoloader, betreffen also die Dateien mit Klassen im LIB-Verzeichnis und deren Suche durch den Autoloader
FriendsOfRedaxo\«addonname»
wird automatisch mitredaxo/src/addons/addons/«addonname»/lib
assoziiert.Der Dateiname entspricht dem Klassennamen (Datei:
Box,php
und darin dieclass Box { ... }
FriendsOfRedaxo\Geolocation\Calc\Box::factory()
entsprichtredaxo/src/addons/addons/«addonname»/lib/geolocation/Calc/Box.php
Geschmacksache. Erklärt am Geolocation-Beispiel. Aus Sicht des Addon-Entwicklers klingt es gut, alle YForm-bezogenen Klassen
unter
lib/YForm/..
abzulegn (Bsp:lib/YForm/Dataset/Mapset.php
). Aus Sicht des Addon-Nutzers wäre vieleicht, da Mapset oft benötigt wird,lib/Mapset.php
angenehmer. Man muss sich halt entscheiden ...Das zeigt die Richtung und damit kann man sich als Addon-Entwickler die Umstellung machen.
Was fehlt?
Es braucht eine klare Aussage, ob Namespaces erforderlich sind oder (dringend) empfohlen. Alte Prophezeiung der noramerikanischen Indigenen südlich der arktischen Gebiete: Wenn es kein Muss ist und die Redaxo-Instanzen dennoch funktionieren, fällt für viele Addons die Umstellung aus! Der Aufwand wird in dem Fall verständlicher Weise als unnötig angesehen und die meisten von uns haben auch so genug zu tun.Das Namensschema muss noch etwas verfeinert werden, denn innerhalb des Addons sind möglicherweise weitere Unterteilungen sinnvoll. (Theoretisches) Beispiel:FriendsOfREDAXO\addonname\yform\value\xyz
.Laut PSR4 muss (soll) die Verzeichnisstruktur zum Namespace passen. Daher wäre auch hier eine verfeinerte Anleitung sinnvoll. (Theoretisches) Beispiel:FriendsOfREDAXO\addonname\yform\value\xyz
und die Datei dazuaddonname/lib/yform/value/xyz.php
.Es braucht einen technischen Migrationspfad. Beispiel: Addon auf Namespace umrüsten, aber zugleich die alten Klassennamen ohne Namespace für einen Zeitraum X weiter mitführen.Damit das nicht ewig so bleibt: siehe klare Zeitschiene!Einige Addons (z.B.yform_adminer
) haben einen Namespace-Namen (FriendsOfRedaxo\YFormAdminer
), der zwar im Prinzip richtig ist, vom Repo-Namen leicht abweicht. Auch da müsste vor dem Hintergrund composer und PSR4 noch mal geklärt werden, wie Namen zu wählen sind. Vieleicht wird man auch Repos umbenennen müssen?Die meisten Punkte haben sich aus meiner Sicht (@christophboecker ) weitgehend geklärt.
Wo stehen wir heute?
Eine kurze Suche am 30.01.2024 im FOR-Repo zeigt ein kunterbuntes Gemisch, wobei die meisten Addons ohne Namespace laufen.
Übersicht zu FOR-Addons (02.02.2024)
In den Non-FOR-Addons habe ich nur mal stichprobenartig reingesehen. Auch da ein sehr gemischtes Bild: ohne Namespace überwiegt, ein paar laufen im Namespace, der Name ist aber öfters mal nicht konform wie bei vielen FOR-Adons auch.
Tips zur Umstellung eines Adons
Ich gehe davon aus, dass alle hier hinreichend kundig sind. Das wird keine Schulung. Nur in aller Kürze ein paar kleine Hinweise auch als Mutmacher für diejenigen, die sich noch nicht ´rangetraut haben. Wenn ich das kann, dann kann es jeder ....
Referenzen
Wie schreibt man das?
Als Beispiel können die oben genannten Addons helfen. Hier mal ein Beispiel-Code (vor Namespace) aus der
boot.php
des Addonsyform_adminer
:Jede geeignete Datei wird mit einem
namespace
-Statement am Anfang in den Namensraum aufgenommen.Danach zeigt die Entwicklungsumgebung Fehler an, da die Klassen
rex_perm
,rex
,rex_addon
undYFormAdminer
im Namensraum
FriendsOfRedaxo\YFormAdminer
gesucht und nicht gefunden werden. FürYFormAdminer
muss noch die zugehörige Datei in den Namespace aufgenommen werden. Die anderen drei benötigen den Hinweis auf ihren tatsächlichen Namespace. Dazu gibt es zwei Möglichkeiten:\rex_perm
use rex_perm;
, nach dem Namespace-Statement;Der Umstellungsaufwand hält sich also in Genzen, da lediglich die nicht im eigenen Namespace vorkommenden Klassen mit
use
aufgelistet werden müssen.Unterstützung durch die IDE
Zumindest für meine VSCode-Installation kann ich festhalten:
\rex
). Ein anschließender Lauf mit dem CS-Fixer wird die neue Referenz meist erkennen und (1) oben im Code einuse rex;
einfügen und (2) an der Fundstelle auf den Klassennamen reduzieren (rex
).Welche Dateien kann man anpassen?
Die meisten PHP-Dateien können mit Namespace versehen werden. Das betrifft neben den Dateien im Lib-Verzeichnis und anderen Verzeichnissen wie
functions
oderextensions
(hier und da gibt es sie noch) auch Dateien und Verzeichnisse mit speziellen Aufgaben:«addon»/fragments
«addon»/yfragments
In Modulen und Templates können möglicherweise Namespaces eingesetzt werden. Aber macht das irgendeinen Sinn? Ich habe es nie ausprobiert. Aber sinnvoll und funktionierend ist das USE-Statement (siehe Geolocation-Doku für Entwickler).
Callbacks z.B. in YForm-Formularen
Die per Callback aufgerufenen Methoden und Funktionen dürfen ruhig in einem Namespace liegen. Aber sie müssen dann auch mit dem vollen Namen hinterlegt werden.
Als allgemeiner Hinweis und Vorschlag: man könnte die Gelegenheit nutzen und veraltete Schreibweisen für Callbacks etc. anpassen, wo es eben geht. Das senkt die Fehleranfälligkeit und verbessert die statische Code-Analyse (IDE, RexStan).
Beispiele
'klasse'
wirdklasse::class
is_a($media,'FocuspointMedia')
is_a($media,FocuspointMedia::class)
'klasse::methode'
,array('klasse','methode')
oder['klasse','methode']
wirdklasse::methode(...)
rex_extension::register('EP_NAME', 'klasse::methode');
rex_extension::register('EP_NAME', array ('klasse', 'methode'));
rex_extension::register('EP_NAME', ['klasse', 'methode']);
rex_extension::register('EP_NAME', klasse::methode(...));
Wo liegen aktuell die Grenzen?
Namespaces sind derzeit nicht möglich mit Klassen, die über ihr Namensschema aufgefunden werden. Das sind aktuell z.B.
rex_api_xxx
rex_effect_xxx
rex_yform_value_xxx
rex_yform_action_xxx
rex_yform_validate_xxx
rex_var_xxx
Möglicherweise gibt s noch mehr von der Sorte in diesem oder jenem Addon. Diese Klassendateien müssen Stand heute ohne Namespace auskommen.
Anders ist es bei eigenen Cronjob-Klassen oder YForm-Dataset-Klassen (Model-Klassen). Sie müssen ausrücklich registriert werden müssen, dabei wird der Namespace berücksichtigt.
Für API-Klassen gibt es ab REDAXO 5.17 die Möglichkeit, Klassen (auch mit Namespace) zu registrieren. Beispiel:
In der boot.php registrieren mit:
Breaking Change und gleitender Übergang
Ja, die Umstellung auf Namespace ist ersteinmal ein Braking Change. Damit würde das Addon, selbst wenn es keine neuen Features oder Bugfixes gibt, eine neue Hauptversionsnummer erhalten.
Es gibt aber eine Übergangslösung. Die eigentliche PHP-Datei wird auf Namespace umgestellt. Zusätzlich gibt es eine zweite, neue PHP-Datei, die nichts anderes macht als auf die Hauptdatei im Namespace umzuleiten.
Beispiel vorher:
Es gibt eine Datei
lib/xyz.php
mit einer Klasse xyzBeispiel nachher:
Die Datei
lib/xyz.php
ist auf Namespace umgestellt und die Klasse heißt nun vollständigFriendsOfRedaxo\MyAddon\Xyz
.Eine weitere Datei
lib/no_namespace/xyz.php
enthält die Referenz mit einem Deprecated-Hinweis (gerne "deutlich" formulieren )Beta Was this translation helpful? Give feedback.
All reactions