Sollte ich App :: import ('Model', ...) oder ClassRegistry (...) verwenden?

8

Wegen anderer Antworten ( gefällt das ), ich möchte nur klarstellen, was in CakePHP 1.3 verwendet werden sollte.

Genauer gesagt, habe ich eine Situation, in der ein Modell von einem anderen abhängt, also möchte ich von einer Methode in diesem Modell ein anderes laden, etwas mit den Informationen machen usw.

Die Dokumentation für die App-Klasse lautet:

  

In früheren Versionen gab es verschiedene Funktionen zum Laden einer benötigten Klasse basierend auf dem Typ der Klasse, die Sie laden wollten. Diese Funktionen sind veraltet, das Laden aller Klassen und Bibliotheken sollte jetzt über App :: import () erfolgen.

Ich gehe davon aus, dass dies die Verwendung von ClassRegistry usw. abdeckt, aber ich möchte nur klar und sicher sein:

Soll ich App::import('Model', ...) verwenden, um ein Modell von einem anderen Modell oder etwas anderes zu verwenden? Wenn was anderes, was?

    
anonymous coward 08.03.2011, 20:28
quelle

4 Antworten

13

Es scheint, dass sogar zwei Jahre seit 2008 die beste Methode ist, trotz der genannten Dokumentation ClassRegistry::init() zu verwenden.

Dies wird in der eigentlichen API / Dokumentation für die spezifischen Klassen / Methoden deutlich gemacht.

App::import()

  

Sucht nach Klassen, die auf $ name oder bestimmten zu suchenden Dateien basieren. App :: import () ruft keine Klassen auf, die in den Dateien enthalten sind. Es wird nur gefunden und benötigt () die Datei.

ClassRegistry::init()

  

Lädt eine Klasse, registriert das Objekt in der Registrierung und gibt die Instanz des Objekts zurück.

     

Beispiele Einfache Verwendung: Holen Sie eine Post-Modellinstanz ClassRegistry :: init ('Post');

Wie Sie sehen können, zeigt sogar die API-Dokumentation Beispiele für die Verwendung von ClassRegistry zum Laden von Modellen, die für Sie instanziiert werden, im Gegensatz zu App::import (was viel weniger tut) und trotz der geänderten Formulierung in CakePHP "Buch" -Dokumentation.

    
anonymous coward 09.03.2011, 19:57
quelle
7

Wenn Sie die Modelle in Beziehung setzen können, ist es am besten, die Beziehungen dynamisch mit

zu verknüpfen

$this->bindModel("hasOne" => array("Model2")) .

Wenn Sie das Modell nicht zuordnen können und das zweite Modell nur einmal verwenden möchten, können Sie

verwenden

ClassRegistry::init('Model2')->find('allThatIWant');

Wenn Sie es in mehreren Vorkommen verwenden möchten, müssen Sie

versuchen %Vor%     
RSK 09.03.2011 05:16
quelle
2

Ab 2.6.x ist es natürlich noch ClassRegistry :: init ().

Es gibt einen großen Unterschied. App :: Import wird nur enthalten / erfordern. Auf der anderen Seite wird ClassRegistry :: init () es instanziieren und Sie ein vollständig geladenes Objekt holen des Modells.

Sie haben beispielsweise ein Modell in beforeFilter Ihres AppControllers geladen. Sie fügen einige benutzerdefinierte Eigenschaften hinzu, indem Sie $ this- & gt; Model- & gt; __ something verwenden. Jetzt rufen Sie ClassRegistry :: init ('Model') irgendwo auf, wo Sie kein $ controller-Objekt zur Verfügung haben, z. B. in einem Verhalten. Das von ClassRegistry :: init ('Model') zurückgegebene Objekt wird über Ihre benutzerdefinierte Eigenschaft $ this- & gt; Model- & gt; __ etwas verfügen.

Btw, $ controller- & gt; loadModel () scheint die ideale Methode zu sein, ein Modell zu laden, in dem Sie ein $ controller-Objekt zur Verfügung haben, zum Beispiel in Ihren Komponenten.

    
Arvind K. 23.01.2015 10:22
quelle
-2

$this->loadModel('model name') wird tun, wenn Sie es für den gesamten Controller brauchen, Dann definieren Sie einfach die Beziehung im Modell wie Hasone, gehören zu ... und rufen Sie $this->model->model2 .

    
Juslin Guo 08.03.2011 20:58
quelle