2016-04-04 7 views
0

Wie der Titel besagt, möchte ich auf ein Verhalten in einer Entität zugreifen. Da ich im Kochbuch nichts finde, gehe ich davon aus, dass das nicht so ist, wie es gemacht werden sollte. Außerdem habe ich diese Frage gefunden, die sich auf Symphony bezieht, aber scheint, als ob dies auch für CakePHP gilt: Accessing Symfony2 global parameter in entity class.Zugreifen auf Verhalten in Entitätsklasse CakePHP 3

Was ich erreichen möchte ist, dass, wenn ein bestimmtes Feld/Spalte (in meinem Fall 'Link' genannt) automatisch aufgerufen wird, dieses Feld immer mit einer externen Bibliothek konvertiert (in meinem Fall eine vordefinierte URL erstellen für eine Datei, die auf Amazon S3 gespeichert ist).

class Picture extends Entity{ 
    ...... 

    protected function _getLink($link){ 
     return $this->s3->getPresignedUrl($link); 
    } 
    ...... 
} 

Meine Frage ist daher, wie ich damit umgehen soll. Sollte ich eine afterFind-Methode im Modell verwenden, die prüft, ob auf dieses Feld zugegriffen wird und damit auf das Aufrufen des Verhaltens reagiert? Kann jemand bestätigen, dass das Symphony-Beispiel auch für CakePHP gilt?

Antwort

0

Da ich im Kochbuch nichts finden kann, gehe ich davon aus, dass das nicht so ist, wie es gemacht werden sollte.

Korrekt. Eine Entität muss nicht wissen, irgendetwas über Verhaltensweisen.

Ich weiß nicht, woher der S3 Link generierende Code stammt, aber er sollte neutral zu jeder Schicht sein und nicht mit der Modellschicht gekoppelt sein. Wenn das nicht der Fall ist, refaktorieren Sie es. Und dann verwenden Sie eine Instanz des S3-Link-Generators in Ihrer Entitäts-Accessormethode, genau wie Sie es in Ihrem Codebeispiel gezeigt haben.

Wenn Sie das aus irgendeinem Grund nicht tun können, gehen Sie für den afterFind() - Rückruf genauso vor, wie Sie es vorgeschlagen haben.

Symfony funktioniert übrigens anders, soweit ich weiß ist fast alles ein Service dort und durch die Umsetzung von DI ist es theoretisch möglich von überall her auf alles zuzugreifen. Schätze, es ist einfach, Spaghetti-Code mit ihm zu bauen, wenn du nicht weißt, was du tust. CakePHP bevorzugt Lokalisierer.

0

Ich weiß, dass dies beantwortet wird, aber für zukünftige Referenz, denke ich, sollten Sie traits überprüfen.

Normalerweise verwende ich Merkmale für diesen speziellen Zweck oder nutzen Sie einfach Composer.

+0

Ahh großartig! Ich denke, das ist auch eine großartige Lösung, um ähnliche Probleme in der Zukunft zu lösen. – markvdlaan93