Aktuell aktualisiere ich eine ziemlich alte Extension. In einem Bereich dieser Extension werden alle Termine gelistet, auch die inaktiven. Diese sind über eine updateAction bearbeitbar. Normalerweise resultiert eine updateAction(FooObjekt $fooObjekt) eines inaktiven Datensatzes in einer Exception.
Früher habe ich das total umständlich umgangen, indem ich bei der editAction $fooObjekt nicht als Objekt sondern als Array abbildete und erst in der updateAction wieder in ein Objekt wandelte. Die Validierung habe ich dann über einen Validator vorgenommen, den in in initializeActionMethodValidators() im Controller eingebunden habe.
Soviel zur Vorgeschichte. Nun möchte ich in Typo3 13.4 (Composer) nur noch dann im Controller initiierten Validatoren einbinden, wenn sie Laufzeitparameter benötigen. Alle anderen Validatoren sollen im Model definiert werden. Das funktioniert auch prima und ist zudem super für die Datenintegrität. ABER… Jetzt arbeite ich durchweg mit Objekten. Mein alter Ansatz mit dem Array ist a) inkonsistent und b) bedeutet ich muss für den Updatevorgang einen eigenen Validator schreiben. Der von mir bevorzugte Ansatz nur Objekte zu verwenden bedeutet jedoch, dass auch versteckte Datensätze an updateAction(FooObjekt $fooObjekt) übergeben werden müssen. Wie löst ihr das? Ich habe folgendes probiert:
1. QuerySettings im Controller setzen
public function initializeAction(): void
{
if ($this->actionMethodName == 'updateAction') {
$settings = GeneralUtility::makeInstance(Typo3QuerySettings::class);
$settings->setIgnoreEnableFields(true)
->setEnableFieldsToBeIgnored(['disabled']);
$this->fooRepository->setDefaultQuerySettings($settings);
}
}
Aber das greift ja nur für die Repository Instanz die im Controller initiert wird und nicht die die Typo3 für den Request benutzt. Fiel mir dann ein, als ich es umgesetzt hatte... Naja, egal, hat ja nur einen Moment gedauert.
2. Middleware
Ok, dieser Versuch war einfach nur ein Proof-Of-Concept, funktioniert aber...grundsätzlich. Nach dem Absenden prüft die Middleware ob in der persisted Instanz „hidden“ wahr ist und setzt es ggf. auf falsch. Dadurch wird das Objekt von den Mechanismen im Controller gefunden und die Validierung funktioniert auch. Danach werden im Controller die Parameter zur Sichtbarkeit vom aktuellen Request übernommen. Das funktioniert auch tadellos, ist aber aufgrund der offensichtlichen Dateninkonsistenz zur Laufzeit nicht für den Produktiveinsatz geeignet. D.h. wenn es mal zu einer Exception kommt o.ä. kommt könnte der Datensatz in einem Sichbarkeites-Zustand sein der nicht gewünscht ist.
Ja, jetzt sitz ich hier und überlege wie ich das lösen kann. Eine Suche im Netz war nicht erfolgreich, ChatGPT hat mir mal wieder irgendwelche „fake“ Funktionalitäten vorgegaukelt die es nicht gibt.
Also, wie löst ihr das?