Katalog der Entwurfsmuster
Dieser Katalog richtet sich an Entwickler, die Exponential erweitern oder seinen Kernel ändern. Er listet jede Abstraktion auf, die der Code verwendet, wo sie liegt und wie eine neue Implementierung eingehängt wird, damit neuer Code den bereits vorhandenen Mustern folgt, statt neue zu erfinden. Er wird aus dem Quellcode generiert und ist daher für den Code, aus dem er gebaut wurde, vollständig und aktuell; die Regeln, die jedes Muster erkennen, sind heuristisch und werden weiter unten erklärt.
Lauffähige Beispiele für die meisten dieser Erweiterungspunkte: Beispiele und das Kochbuch.
Die Regeln, denen der Code folgt: Standards und Architektur des Kernels.
In Zahlen
| Vorkommen (alle Kategorien) | 6206 |
| Klassen, Interfaces, Traits und Enums | 3516 (3419 Klassen, 96 Interfaces, 1 Trait) |
| ... mit mindestens einem Muster | 2871 |
| Modulansichten | 532 |
| Richtlinienfunktionen | 260 |
| Fetch-Funktionen | 316 |
| Template-Operatoren | 255 |
| Cronjob-Teile | 49 |
| Event-Hooks | 99 |
| INI-Plugin-Punkte | 842 |
| Gelesene Quelldateien | 4512 PHP, 577 INI |
| Bereiche | 155 |
Die Muster
| Muster | Gruppe | Vorkommen | Erkannt an |
|---|---|---|---|
| Active Record (eZPersistentObject) | Datenzugriff | 234 | Erweitert eZPersistentObject, direkt oder über eine Elternklasse. |
| Datentyp (Strategie für Inhaltsfelder) | Plugins | 54 | Erweitert eZDataType, direkt oder über eine Elternklasse. |
| Workflow-Ereignistyp (Befehl, Plugin) | Plugins | 15 | Erweitert eZWorkflowEventType. |
| Template-Operator (Interpreter-Plugin) | Plugins | 338 | Registriert in einer eztemplateautoload.php ($eZTemplateOperatorArray[]) oder hat operatorList() und modify(). |
| Template-Funktion (Interpreter-Plugin) | Plugins | 45 | Registriert in einer eztemplateautoload.php ($eZTemplateFunctionArray[]) oder hat functionList() und process(). |
| Fetch-Funktion (Query Object, Fassade) | Plugins | 354 | Ein Eintrag in der function_definition.php eines Moduls oder eine Klasse namens *FunctionCollection. |
| Modulansicht (Page Controller) | Anfrageverarbeitung | 993 | Ein Eintrag von $ViewList in einer module.php oder eine Klasse, die ModuleView oder Page erweitert (die ausführbare Form einer Ansicht). |
| Richtlinienfunktion (Zugriffskontrolle) | Anfrageverarbeitung | 260 | Ein Eintrag von $FunctionList in einer module.php. |
| Front Controller | Anfrageverarbeitung | 10 | Die Kernel-Klassen ezpKernel, ezpKernelWeb, ezpKernelTreeMenu, ezpKernelRest, eZModule und verwandte. |
| Befehl (Konsole, Skripte, Cronjobs) | Anfrageverarbeitung | 247 | Erweitert Command, CronjobPart oder Runnable (die ausführbaren Konsolenbefehle und Cronjob-Teile) oder eine Datei cronjobs/*.php. |
| Singleton / instance() | Erzeugung | 77 | Hat eine statische Methode instance() oder getInstance(). |
| Fabrik und statische Fabrikmethoden | Erzeugung | 443 | Klassenname endet auf Factory oder hat statische Methoden create(), from(), factory(), make*() oder erzeugt new self/new static in einer statischen Methode. |
| Builder | Erzeugung | 10 | Klassenname enthält Builder oder Generator. |
| Registry | Struktur | 39 | Klassenname enthält Registry oder hat statische Methoden register*(). |
| Strategie / Handler | Verhalten | 382 | Klassenname endet auf Handler, Backend, Driver, Transport, Engine oder Strategy oder implementiert ein Interface, dessen Name so endet. |
| Schablonenmethode / abstrakte Basisklasse | Verhalten | 69 | Eine abstrakte Klasse mit abstrakten und konkreten Methoden. |
| Schnittstelle (Vertrag) | Struktur | 96 | Jedes Interface. |
| Beobachter / Listener / Ereignis | Verhalten | 10 | Klassenname enthält Listener, Observer oder Subscriber oder hat Methoden attach()/notify()/addListener(); jeder Aufruf von ezpEvent notify()/filter() (siehe die Seite zu den Hooks). |
| Ereignis-Hook (ezpEvent) | Verhalten | 99 | Ein Aufruf von ezpEvent::getInstance()-›notify( 'EVENT' ) oder -›filter( 'EVENT' ). |
| Adapter / Bridge / Wrapper | Struktur | 6 | Klassenname enthält Adapter, Bridge, Wrapper oder Proxy. |
| Fassade / Dienst | Struktur | 40 | Klassenname endet auf Facade, Service, Manager, API oder Api. |
| Dekorierer / Filter | Struktur | 64 | Klassenname enthält Decorator oder Filter. |
| Zuständigkeitskette (Chain of Responsibility) | Verhalten | 19 | Klassenname enthält LoginHandler, Chain, Pipeline, Middleware, Router oder Matcher. |
| Iterator | Verhalten | 16 | Implementiert Iterator, IteratorAggregate oder ArrayAccess. |
| Wertobjekt / Struktur | Struktur | 106 | Klassenname endet auf Struct, Value, Result, Item, Info oder Definition und die Klasse hat wenige Methoden, oder sie erweitert ezcBaseStruct. |
| Ausnahmehierarchie | Struktur | 73 | Erweitert Exception, eine Klasse *Exception oder Error. |
| Trait (Mixin) | Struktur | 1 | Jeder Trait. |
| Hilfsklasse (statische Hilfsfunktionen) | Struktur | 730 | Eine konkrete Klasse, deren Methoden alle statisch sind (mindestens zwei). |
| INI-Plugin-Punkt (Erweiterungspunkt) | Plugins | 1376 | Eine Einstellung einer Datei settings/*.ini (oder der einer Extension), deren Wert der Name einer Klasse des Katalogs ist. |
Die Bereiche
Eine Seite pro Teil der Codebasis: jede Klasse mit ihren Mustern und die dort definierten Ansichten, Funktionen, Operatoren und Plugin-Punkte.
Was gelesen wurde
Die von Git verfolgten PHP- und INI-Dateien unterhalb von kernel/, lib/ und extension/ des Exponential-Repositorys (ohne Tests und vendor/-Verzeichnisse) sowie diese Extensions:
| Extension | Quelle |
|---|---|
AdminAid | eigenes Repository |
autorss | Composer-Paket |
bccie | Composer-Paket |
bcgooglesitemaps | Composer-Paket |
bcwebsitestatistics | Composer-Paket |
birthday | Composer-Paket |
cjw_newsletter | Composer-Paket |
cjw_themes_jumper | eigenes Repository |
cjw_tmv | eigenes Repository |
enhancedezbinaryfile | Composer-Paket |
enhancedselection2 | Composer-Paket |
exp_adminui | eigenes Repository |
exp_enhanced_link | Composer-Paket |
exp_oe_tiptap | eigenes Repository |
expai | eigenes Repository |
expchangeclass | eigenes Repository |
exphelpsite | mit dem Kernel ausgeliefert |
expimageeditor | mit dem Kernel ausgeliefert |
explayouts | eigenes Repository |
explayouts_api | eigenes Repository |
explayouts_content_browser | eigenes Repository |
explayouts_content_browser_core | eigenes Repository |
explayouts_content_browser_ui | eigenes Repository |
explayouts_core | eigenes Repository |
explayouts_relation_list_query | eigenes Repository |
explayouts_site_api | eigenes Repository |
explayouts_standard | eigenes Repository |
explayouts_tags_query | eigenes Repository |
explayouts_ui | eigenes Repository |
explayouts_ui_api | eigenes Repository |
expquery_translator | eigenes Repository |
expqueue | eigenes Repository |
expservices | mit dem Kernel ausgeliefert |
expsite_api | eigenes Repository |
expsite_app | eigenes Repository |
expsite_core | eigenes Repository |
expsite_data_media | eigenes Repository |
expsite_installer | eigenes Repository |
expui | eigenes Repository |
ezauthorize | Composer-Paket |
ezautosave | Composer-Paket |
ezdemo | Composer-Paket |
ezfind | eigenes Repository |
ezflow | Composer-Paket |
ezformtoken | mit dem Kernel ausgeliefert |
ezgmaplocation | Composer-Paket |
ezie | Composer-Paket |
ezjscore | mit dem Kernel ausgeliefert |
ezmbpaex | Composer-Paket |
ezmultiupload | Composer-Paket |
ezodf | Composer-Paket |
ezoe | mit dem Kernel ausgeliefert |
ezoracle | eigenes Repository |
ezownerchange | eigenes Repository |
ezpaypal | Composer-Paket |
ezpm | Composer-Paket |
ezpostgresqlcluster | Composer-Paket |
ezprestapi | Composer-Paket |
ezprestapiprovider | Composer-Paket |
ezssp | Composer-Paket |
ezstarrating | Composer-Paket |
eztags | Composer-Paket |
ezupdate | Composer-Paket |
ezurlmultisite | eigenes Repository |
ezwebin | Composer-Paket |
ezwt | Composer-Paket |
git_manager | Composer-Paket |
hcaptcha | Composer-Paket |
ngclasslist | Composer-Paket |
nxc_powercontent | Composer-Paket |
owsimpleoperator | Composer-Paket |
powercontent | eigenes Repository |
recaptcha | Composer-Paket |
sevenx_authentication_2fa | eigenes Repository |
sevenx_dse | eigenes Repository |
sevenx_themes_media | eigenes Repository |
sevenx_themes_simple | Composer-Paket |
sevenx_themes_super | Composer-Paket |
sqliimport | eigenes Repository |
str_replace | Composer-Paket |
swark | Composer-Paket |
syndication | Composer-Paket |
xrowextract | Composer-Paket |
xrowmetadata | Composer-Paket |
Eine Extension wird gelesen, wenn sie ein eigenes Git-Repository unterhalb von extension/ ist, dessen Origin ein Repository von se7enxweb ist, oder ein dort installiertes Composer-Paket von se7enxweb; private Extensions und Website-Einstellungen werden nie gelesen. Eine Website mit weiteren installierten Extensions erhält einen größeren Katalog, wenn sie den Generator ausführt.
Wie der Katalog gebaut wird
Ausführen im Wurzelverzeichnis der Installation (keine Datenbank, nichts wird geladen oder ausgeführt; der Tokenizer von PHP liest die Dateien):
php bin/php/exppatterncatalogue.php # report which pages would change
php bin/php/exppatterncatalogue.php --write # write doc/eng-us/standards/patterns/
php bin/php/exppatterncatalogue.php --check # exit 1 when the pages are out of dateDie Ausgabe hängt nur vom Quellcode ab: keine Datumsangaben, keine Commit-IDs, alles sortiert, sodass ein zweiter Lauf auf demselben Code dieselben Bytes schreibt. Committen Sie die Seiten mit der Code-Änderung, die sie verändert.
Jede Kategorie hat eine Regel (die Tabelle oben und die Seite jedes Musters). Eine Klasse kann zu mehreren Kategorien passen. Die Regeln verwenden den Namen der Klasse, ihre Elternklassen und Interfaces (durch die gesamte Codebasis verfolgt), ihre Methoden (statisch, abstrakt) und die Registrierungsdateien des Kernels: module.php (Ansichten und Richtlinienfunktionen), function_definition.php (Fetch-Funktionen), eztemplateautoload.php (Template-Operatoren und -Funktionen), Verzeichnisse cronjobs/, Aufrufe von ezpEvent und INI-Einstellungen, deren Wert ein Klassenname ist. Namen sind eine Heuristik: Eine Klasse namens ...Manager wird als Facade oder Service geführt, auch wenn sie etwas anderes ist, und ein Muster, das ohne die üblichen Namen umgesetzt ist, wird übersehen. Die Beschreibungen sind der erste Satz des Doc-Kommentars jeder Klasse.
Hinweis Der Katalog beschreibt den Code, wie er ist, einschließlich geerbten Codes. Er ist keine Liste von Empfehlungen: Folgen Sie für neuen Code den Regeln zu Schichten und Benennung.