Seit cakePHP3 gibt es ja bekanntlich in der Entity eines jeden Models die wunderbaren – ich nenne sie mal – magischen _get() Funktionen, mit denen man hervorragend einzelne Felder einer Entität vor der Ausgabe modifizieren kann. Leider hat es bei mir in der Vergangenheit immer zu Verwirrungen geführt, wenn man auf einen Feld nicht nur lesend, sondern auch schreibend zugreifen möchte. Nehmen wir als Beispiel das Model Issue. Issue hat ein Feld cover. In diesem Feld soll nun der Dateieiname des Cover Bildes abgespeichert werden. Beim Aufruf der Entitität soll im Feld cover aber nicht nur der Bilddateiname, sondern auch der komplette Pfad zur Datei stehen, also z.B. http://www.phihochzwei.com/issuesdemo/files/cover/cover.jpg. Der Accessor sieht hierfür dann so aus:

Möchte man nun aber über /issues/add, bzw. /issues/edit ein neues Cover einfügen würde die _getCover() Funktion zum ersten mal aufgerufen werden, wenn die Seite geladen wird. Es würde dann zu dem Zeitpunkt http://www.phihochzwei.com/issuesdemo/files/covers/http:://www.phihochzwei.com/issuesdemo/files/covers/cover.jpg ausgegeben werden. Lädt man nun ein neues Bild hoch, steht im $value vermutlich ein Array, je nachdem, wie man mit Uploads umgeht. Bevor der cake Kern nun intern die Entität mit patchEntity() verändert, wird der Wert von cover auf http://www.phihochzwei.com/issuesdemo/files/covers/Array geändert (zusätzlich wird auch noch, je nach error_reporting Einstellung eine Warnung ausgegeben).  Um dieses Problem zu umgehen ist die Lösung eigentlich ziemlich einfach. Die Entität selber hat kein $this->request, um mehr über die aktuelle Umgebung zu erfahren, aber sie weiß ob das aktuelle Feld dirty ist. Und genau hiermit kann man folgendes machen:

Wird die _getCover() Funktion im Kontext einer Speicheroperation mit geänderten Wert aufgerufen, wird der eingegebene Wert $value nicht verändert, ansonsten wird er modifiziert. Somit kann man sehr komfortabel Felder zur Ausgabe anpassen.



Kategorien: LDA - Test Product / Tutorials

18. Mai 2016
Sebastian Köller

Verfasst von
Sebastian Köller