2011-03-08 21 views
8

Debido a otras respuestas (like this), solo quiero aclarar qué se debe usar en CakePHP 1.3.¿Debo usar App :: import ('Model', ...) o ClassRegistry (...)?

Específicamente, tengo una situación que exige un modelo a depender de otro, por lo que a partir de un método en el que el Modelo Me gustaría cargar otro, hacer algunas cosas con la información, etc.

El documentation for the App Class dice:

En versiones anteriores había diferentes funciones para cargar una clase necesaria según el tipo de clase que desea cargar. Estas funciones han quedado obsoletas, toda la carga de clases y bibliotecas se debe realizar a través de App :: import() ahora.

Asumo que esto cubre el uso de ClassRegistry, etc, pero sólo quiero que quede claro y seguro:

¿Debo usar App::import('Model', ...) de utilizar un modelo de otro, o alguna otra cosa ? Si algo más, ¿qué?

+0

Como no puedo comentar una revisión detrás de escena, pensé en preguntar: vengo a StackOverflow entendiendo que es importante que las preguntas sean claras, y para otros (probablemente a través de la búsqueda) motores) para poder encontrar fácilmente preguntas en el futuro. Hacer que mi pregunta * version specific * sea clara en el título parece tener perfecto sentido, en esos casos. No estoy de acuerdo con la edición, pero creo que veo lo que estás buscando y lo dejaré en suspenso. ¿Es el tema de las etiquetas versus el título delineado en las pautas que perdí en alguna parte? –

Respuesta

13

parece que, incluso dos años desde 2008, el mejor método es utilizar ClassRegistry::init(), a pesar de la documentación citada.

Esto se hace evidente en la API/documentación real para las clases/métodos específicos.

App::import()

Finds clases basadas en el nombre $ o archivo (s) específica para la búsqueda. Calling App :: import() no construirá ninguna clase contenida en los archivos. Solo encontrará y requerirá() el archivo.

ClassRegistry::init()

Carga una clase, registra el objeto en el registro y vuelve instancia del objeto.

Ejemplos Uso simple: Obtener una instancia de modelo de publicación ClassRegistry :: init ('Post');

Como se puede ver, incluso la documentación de la API señala ejemplos del uso de ClassRegistry para cargar modelos, crear instancias de ellos para que, a diferencia de App::import (que lo hace mucho menos), ya pesar de la redacción modificada en el CakePHP " Libro "documentación".

-2

$this->loadModel('model name') lo hará a menos que lo necesite para todo el controlador, entonces simplemente defina la relación en el modelo como hasone, belongsto ... y llame al $this->model->model2.

+0

No estoy en un controlador en este momento. Estoy utilizando el Modelo-A desde dentro de un método en el Modelo-B. –

+1

obsoleto en cakePHP 2! – FAjir

7

Si se puede relacionar los modelos a continuación, la mejor forma de hacerlo es enlazar dinámicamente las relaciones usando

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

Si no se puede relacionar el modelo y desea utilizar el segundo modelo de una sola ocurrencia, puede utilizar

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

si desea utilizarlo en varios ocurrencia entonces debes probar

$this->model2 = & ClassRegistry::init('Model2') 
$this->model2->find('allThatIWant'); 
+1

por favor recuerde 'App :: import()' es el peor método. Úselo solo como último intento. – RSK

+0

Bien, ahora estoy aún más curioso. ¿Esto se discute comúnmente en la lista de correo o algo así, porque incluso la documentación 1.3 eliminó "otras opciones" para acceder a un modelo dentro de un modelo y sugiere App :: import() ... ¿Hay algo que explique esto claramente? en la documentación? ¡Gracias por tu respuesta y tu ayuda! –

+1

revisa los comentarios de esta publicación. http://nuts-and-bolts-of-cakephp.com/2008/12/16/how-to-build-a-dashboard-for-your-application-in-cakephp/ – RSK

2

A partir de 2.6.x, por supuesto, es ClassRegistry :: init() todavía.

Hay una gran diferencia. App :: import solo lo incluirá/lo requerirá. Por otro lado, ClassRegistry::init() creará una instancia y buscará un objeto completamente cargado del modelo.

Por así decirlo, por ejemplo, cargó un modelo en beforeFilter de su AppController. Usted le agrega algunas propiedades personalizadas usando $ this-> Model -> __ something. Ahora llama a ClassRegistry :: init ('Modelo') en algún lugar donde no tiene $ objeto de control disponible, por ejemplo, en un comportamiento. El objeto devuelto por ClassRegistry :: init ('Model') tendrá su propiedad personalizada $ this-> Model -> __ something in tact.

Btw, $ controller-> loadModel() parece la forma ideal de cargar el modelo donde tiene disponible un objeto $ controller, por ejemplo en sus componentes.