Auf dieser Seite werden werden alle notwendigen Code-Änderungen für den Umstieg von Version 1.14 auf 1.15 beschrieben.
Um Angaben zu Port und/oder Socket einheitlich zu definieren wurde der Konfiguration die Möglichkeit mitgegeben nun auch DB.Port und DB.Socket zu definieren. Mit Einführung dieser Konfigurations-Parameter entfällt die Unterstützung im MySQLiHandler, den port aus dem Hostnamen zu extrahieren, entsprechend sind folgende Angaben in der Konfiguration:
DB.Host = "localhost:1234"fortan so zu definieren:
DB.Host = "localhost"
DB.Port = "1234"Der Parameter für das URL-Rewriting wurde mit Version 1.15 von "apf-rewrited-query" auf "apf-rewritten-query" geändert. Für ein Update auf die neue Version ist es notwendig alle Rewrite-Rules anzupassen, die in bestehenden Projekten genutzt werden.
Die Konfiguration des Moduls wurde mit dem Release 1.15 komplett auf dependency injection umgestellt. Dies betrifft in erster Linie die Ablage der Konfigurationen und die Erzeugung des UmgtManager.
Um auf die Version 1.15 zu wechseln, muss folgendes Schema für die Ablage der Konfigurationen eingehalten werden:
/APF/config/modules/usermanagement/
biz/{Context}/
{ENVIRONMENT}_actionconfig.ini
{ENVIRONMENT}_serviceobjects.ini
{ENVIRONMENT}_umgtconfig.ini
data/{Context}/
{ENVIRONMENT}_umgt_domainobjects.ini
{ENVIRONMENT}_umgt_objects.ini
{ENVIRONMENT}_umgt_relations.ini
pres/{Context}/
{ENVIRONMENT}_labels.ini
{ENVIRONMENT}_login.iniVorlagen für die genannten Konfigurations-Dateien finden sich im apf-configpack-*-Release. Details zu Inhalt und Bedeutung wird unter Benutzer-Verwaltung beschrieben.
Der UmgtManager und die gleichnamige Implementierung wird ab der Version 1.15 ausschließlich über den DIServiceManager bezogen. Er erhält damit alle relevanten Informationen und Abhängigkeiten direkt über den dependency injection container.
Um den UmgtManager per
$umgt = &$this->getDIServiceObject('modules::usermanagement::biz', 'UmgtManager');beziehen zu können ist die Konfigurations-Datei *_serviceobjects.ini unter modules::usermanagement::biz (plus zugehörigem Context) erforderlich:
[UmgtManager]
servicetype = "SESSIONSINGLETON"
namespace = "modules::usermanagement::biz"
class = "UmgtManager"
setupmethod = "setup"
init.orm.method = "setORMapper"
init.orm.namespace = "modules::usermanagement::biz"
init.orm.name = "GORM"
conf.app-id.method = "setApplicationId"
conf.app-id.value = "1"
[GORM]
servicetype = "SESSIONSINGLETON"
namespace = "modules::genericormapper::data"
class = "GenericORRelationMapper"
setupmethod = "setup"
conf.namespace.method = "setConfigNamespace"
conf.namespace.value = "modules::usermanagement::data"
conf.affix.method = "setConfigNameAffix"
conf.affix.value = "umgt"
conf.db.method = "setConnectionName"
conf.db.value = "Umgt"
conf.debug.method = "setLogStatements"
conf.debug.value = "false"Darüber hinaus müssen für die Verwendung des mitgelieferten Login die Login- und Logout-RedirectUrlProvider definiert werden (siehe Beispiel-Konfigurations-Dateien).
Wie in der Code-Box weiter oben zu erkennen ist, wurde das Modul auf das Domain-Objekt-Feature des Generischer O/R-Mapper umgestellt. Dies bedeutet, dass der GORM beim Laden der in der *_umgt_objects.ini definierten Objekte konkrete Typen statt dem GenericDomainObject zurückliefert. Dies erleichtert zum einen die Unterscheidung der behandelten Objekte und lässt die API des UmgtManager griffiger erscheinen.
Für die Migration auf die neue Version ist es daher notwendig, dass die Datei EXAMPLE_umgt_domainobjects.ini aus config/modules/usermanagement/data/ für die aktuelle Applikation konfiguriert wird. Erfolgt dies nicht, kann es zu Fehlern kommen, die besagen, dass ein GenericDomainObject statt eines erwarteten Typs UmgtUser (oder jedes weiteren neuen Types) bei einer Operation verwendet wird.
Einhergehend mit der Erweiterung der Funktionen ist auch eine Erweiterung des Daten-Modells erfolgt. Um auf das neue Daten-Modell zu migrieren, kann das Update-Tool des GORM genutzt werden.
Beispiel:
require('./apps/core/pagecontroller/pagecontroller.php');
import('modules::genericormapper::data::tools', 'GenericORMapperUpdate');
$update = new GenericORMapperUpdate();
$update->setContext('xyz');
$update->updateDatabase('modules::usermanagement::data', 'umgt', 'Umgt', true);Damit wird das aktuelle Schema aktualisiert und kann mit der Version 1.15 des APF genutzt werden.
Auch diese Version beinhaltet eine Reihe von API-Änderungen. Die folgende Liste zeigt die notwendigen Änderungen auf:
Das Kontakt-Formular unterstützt nun per Konfiguration Sprach-abhängige Templates für den Versand der Bestätigungs- und Benachrichtigungs-E-Mails. Beim Update auf die neue Version ist es daher notwendig, die Konfiguration der Templates für die aktuelle Applikation anzulegen.
Als Vorlage kann die Beispiel-Konfiguration EXAMPLE_mail_templates.ini unter /config/modules/kontakt4/ genutzt werden. Diese hat folgenden Inhalt (gekürzt):
[de]
confirmation.namespace = "modules::kontakt4::pres::templates::mail"
confirmation.template = "confirmation_de"
notification.namespace = "modules::kontakt4::pres::templates::mail"
notification.template = "notification_de"
[en]
confirmation.namespace = "modules::kontakt4::pres::templates::mail"
confirmation.template = "confirmation_en"
notification.namespace = "modules::kontakt4::pres::templates::mail"
notification.template = "notification_en"Das Modul erwartet die Konfiguration unter dem Pfad
/APF/config/modules/kontakt4/{CONTEXT}/{ENVIRONMENT}_mail_templates.iniDas Release 1.15 beinhaltet ein umfassendes Refactoring der *:getstring-Tag-Familie. Diese wurden vom tools- in den core-Namespace umgezogen um die Einbindung und Verwendung zu erleichtern.
Für die Migration bedeutet das, dass alle Stellen von
<*:addtaglib
namespace="*"
prefix="*"
class="getstring"
/>aus dem Code entfernt werden. Die Tags sind nun automatisch zur Verwendung bekannt.
Mit dem Release 1.15 wurde die globale Fehler-Behandlung refactored. Die Konfiguration eines eigenen ErrorHandler funktioniert damit nicht mehr über die Registry, sondern über die Klasse GlobalErrorHandler innerhalb der Boostrap-Datei.
Eigene ErrorHandler werden nicht wie bisher per
Registry::register(
'apf::core',
'ErrorHandler',
new ErrorHandlerDefinition(
'my::errorhandler::namespace',
'MyErrorHandler'
)
);sondern via
import('my::errorhandler::namespace', 'MyErrorHandler');
GlobalErrorHandler::registerErrorHandler(new MyErrorHandler());nach dem Einbinden der pagecontroller.php konfiguriert.
Details können der Dokumentation unter Fehlerbehandlung entnommen werden.
Wie im vorangegangenen Kapitel für die globale Fehlerbehandlung beschrieben, wurde auch die globale Exception-Behandlung im Release 1.15 refactored. Die Konfiguration eines eigenen ExceptionHandler funktioniert damit nicht mehr über die Registry, sondern über die Klasse GlobalExceptionHandler innerhalb der Boostrap-Datei.
Eigene ExceptionHandler werden nicht wie bisher per
Registry::register(
'apf::core',
'ExceptionHandler',
new ExceptionHandlerDefinition(
'my::exceptionhandler::namespace',
'MyExceptionHandler'
)
);sondern via
import('my::exceptionhandler::namespace', 'MyExceptionHandler');
GlobalExceptionHandler::registerExceptionHandler(new MyExceptionHandler());nach dem Einbinden der pagecontroller.php konfiguriert.
Details können der Dokumentation unter Exception-Behandlung entnommen werden.
Mit dem vorliegenden Release wurde der Logger um die Konfiguration von Schwellwerten bzw. Profilen für Log-Einträge erweitert. Liegt ein Eintrag mit einer definierten severity oberhalb des definierten Schwellwertes bzw. innerhalb des gewählten Profils, so wird der Eintrag in die Log-Datei geschrieben. Falls dies nicht zutrifft, wird er verworfen.
Im Auslieferungszustand werden die severities
als gültige Eintragstypen definiert.
Um den Zustand vor 1.15 wiederherzustellen, ist folgender Code in der Bootstrap-Datei nach dem Einbinden der pagecontroller.php notwendig:
import('core::logging', 'Logger');
$log = &Singleton::getInstance('Logger');
$log->setLogThreshold(Logger::$LOGGER_THRESHOLD_ALL);Alternativ dazu können Sie eigene Profile z.B. per
import('core::logging', 'Logger');
$log = &Singleton::getInstance('Logger');
$log->setLogThreshold(array(
LogEntry::SEVERITY_TRACE,
LogEntry::SEVERITY_INFO
));definieren.
Die Entwicklung des APF wird von JetBRAINS mit PHPStorm-Lizenzen unterstützt und wir sind überzeugt davon, dass PHPStorm die Qualität nachhaltig steigert. Benutzen auch Sie PHPStorm!
Proud to useIntelligent PHP IDE for coding, testing and debugging with pleasure