App::import vs. ClassRegistry::init
App::import vs. ClassRegistry::init
Der richtige Umgang mit ClassRegistry::init und App::import ist vielen unklar. Eine kurze Gegenüberstellung zeigt, wie es noch besser geht.
Immer wieder werde ich gefragt, wann App::import oder ClassRegistry::init zu benutzen sei.
Ich will die Unterschiede erklären, dann wird deutlich, was besser ist:
App::import()
App::import() tut nichts, außer einem include_once der richtigen Datei. Um also eine darin enthaltene Klasse benutzen zu können, muss sie noch instanziiert werden, durch ein new $ClassName;
Daher bietet sich ein App::import immer dann an, wenn in der Datei Code liegt, den man direkt ausführen kann, also statische Methoden / Klassen.
ClassRegistry::init()
ClassRegistry::init() lädt nicht nur die Datei sondern instanziiert auch die darin enthaltene Klasse. Außerdem wird diese Instanz in der ClassRegistry unter einem Namen gespeichert. Somit sind weitere Zugriffe auf diese Instanz leicht möglich. Cake verwaltet hierin unter Anderem alle Model, Helper und Components und sonstige Klassen.
Außerdem gibt diese Methode direkt die Instanz der Klasse zurück. Somit kann sie direkt und ohne Umwege benutzt werden.
$this->loadModel()
Im Controller kann außerdem die Methode loadModel() benutzt werden, um ein Model nicht nur über ClassRegistry zu instanziieren sondern auch direkt als Attribut im Controller zu verwenden. Der Vorteil dieser Methode ist, dass sämtliche Methoden zur Effiziensteigerung (Modelcaches, Persistence) genutzt werden und der Controller direkten Zugriff auf das Model erhält. Cake benutzt intern ebenfalls loadModel() um die Models zu laden.
Empfehlung
Ich würde die Benutzung in umgekehrter Reihenfolge der Auflistung empfehlen. Im Controller benutze ich wo möglich immer loadModel() - an anderen Stellen oder für andere Klassen benutze ich ClassRegistry::init App::import dagegen benutze ich nirgends, außer für libs oder vendors.

44 Kommentare
Neuen Kommentar hinzufügen