Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Der Kernel-Service-Container

Wie PHP-Code den Kernel nach gemeinsam genutzten Objekten über ihren Namen fragt (expKernelServices::get()), wie Sie einen Dienst in kernelservices.ini mit einer Klasse oder Factory, Argumenten, einem Gültigkeitsbereich…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/php-developers/the-kernel-service-container.md

On this page

This page is a translation. Read the English original

Der Kernel-Service-Container

Diese Seite richtet sich an PHP-Entwickler, die Kernel-Code oder Erweiterungen schreiben und gemeinsam genutzte Objekte des Kernels verwenden oder anbieten möchten. Ab 6.0.15 hat der Kernel einen Service-Container: Objekte nach Namen, in den Einstellungen definiert, beim ersten Abruf erzeugt und in einem Gültigkeitsbereich gehalten. Die Referenz für Mitwirkende mit allen Einzelheiten ist der Kernel-Service-Container.

Inhalt

  1. Einen Dienst abrufen
  2. Einen Dienst definieren
  3. Gültigkeitsbereiche
  4. Hooks zum Zurücksetzen pro Anfrage
  5. Kompilieren und prüfen
  6. Testen

Einen Dienst abrufen

$db = expKernelServices::get( 'db' );              // eZDB::instance()
$site = expKernelServices::get( 'ini.site' );      // eZINI::instance( 'site.ini' )
if ( expKernelServices::has( 'my.mailer' ) ) { /* ... */ }
foreach ( expKernelServices::tagged( 'kernel.core' ) as $id => $service ) { /* ... */ }

Die vorhandenen Aufrufe wie eZDB::instance() und eZINI::instance() funktionieren weiterhin und liefern dieselben Objekte; wechseln Sie zu expKernelServices::get(), wenn es Ihnen passt. Jede ID ini.<name> ist eZINI::instance( '<name>.ini' ) und braucht keine Definition.

Einen Dienst definieren

In extension/<yours>/settings/kernelservices.ini.append.php (oder in settings/kernelservices.ini des Kernels):

[Service_my.mailer]
Class=myMailer
Arguments[]=@db
Arguments[]=%ini:mymailer.ini/MailSettings/Sender%
Arguments[]=plain text
Scope=request
Tags[]=my.senders
Description=The mailer of my extension.

[Tags]
TagList[]=my.senders
  • Class wird mit new Class( ...Arguments ) erzeugt; mit Factory=myMailer::create wird stattdessen diese statische Methode aufgerufen.
  • @<id> ist ein anderer Dienst, %ini:<file>/<Section>/<Variable>% eine Einstellung (null, wenn sie nicht gesetzt ist), alles andere wird so übergeben, wie es geschrieben ist (@@x und %%x für ein wörtliches @x oder %x).
  • Ein späterer Block gleichen Namens gewinnt, wie überall in den Einstellungen; Enabled=false schaltet einen Dienst ab.
  • Nichts wird zur Laufzeit per Reflection oder Durchsuchen gefunden: Die Definition sagt alles.

Gültigkeitsbereiche

GültigkeitsbereichPHP-FPM, ApacheVelocity (persistente Worker)Verwenden Sie ihn für
workereiner pro Anfrageeiner pro Worker und Siteaccess, erhalten für jede Anfrage, die der Worker bedienteinstellungsartige Objekte, die nichts von einer Anfrage halten
request (Standard)einer pro Anfrageeiner pro Anfragealles, was den Besucher, die Sitzung, die URI oder das Datenbank-Handle der Anfrage kennt
prototypejedes Mal neujedes Mal neukleine Wertobjekte

Ein Dienst mit Gültigkeitsbereich worker, der die Daten einer Anfrage behält, liefert sie unter Velocity an den nächsten Besucher aus. exp:services:check lehnt einen Dienst mit Gültigkeitsbereich worker ab, der einen Dienst mit Gültigkeitsbereich request als Argument nimmt. Im Zweifel verwenden Sie request; lesen Sie Fallen durch statischen Zustand und Persistente Velocity-Worker für PHP-Entwickler.

Für ein wirklich dynamisches Objekt gibt es expKernelServices::set( 'my.thing', $object ): nur für den Rest dieser Anfrage, nie erhalten und nie kompiliert.

Hooks zum Zurücksetzen pro Anfrage

Der Web-Kernel beginnt jede Anfrage mit expKernelServiceScope::resetRequest(): zuerst die eigenen Zurücksetzungen des Kernels (Abfrage-Cache, SQL-Profil, Nonce der Content Security Policy, Audit, Render-Statistiken, Anfrage-Log und Klassifizierer), dann Ihre:

expKernelServiceScope::onRequestReset( 'my.extension', array( 'myCache', 'resetRequest' ) );

Eine erneute Registrierung unter demselben Namen ersetzt den Hook, sodass eine Registrierung bei jeder Anfrage in Ordnung ist; der Hook bleibt mit dem Worker erhalten und läuft zu Beginn jeder späteren Anfrage, auch unter Velocity.

Kompilieren und prüfen

./console exp:services:compile      # also done by exp:velocity deploy and ezcache.php --clear-tag=ini
./console exp:services:check        # every siteaccess: definitions and compiled files, exit 1 on an error
./console exp:services:list --tag=my.senders -s site
./console exp:services:show my.mailer

Der kompilierte Container (var/cache/kernelservices/) enthält auch die aufgezeichnete Aktivierung der Erweiterungen jedes Siteaccess, die der Web-Kernel anwendet, statt jedes Erweiterungsverzeichnis nachzuschlagen: Wie das korrekt bleibt, steht unter der Kernel-Service-Container.

Testen

Tests ohne Datenbank brauchen keinen kompilierten Container: Ohne einen liest der Container kernelservices.ini, wie es ist. Rufen Sie expKernelServices::reset() in tearDown() auf, wenn ein Test Dienste oder Worker-Zustand setzt. Die eigenen Tests des Kernels stehen in tests/tests/kernel/classes/expKernelServicesTest.php (PHPUnit ohne Datenbank).

Mehr erfahren

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x