domingo, 23 de agosto de 2009

Obtener el nombre de un modelo a partir del array de datos

Actualizado:

José Lorenzo recomienda una forma más compacta en los comentarios:

$modelName = key($model)

No había caído en la función key, que extrae la clave del elemento actual del array, si no hemos hecho nada con él que haya podido variar su puntero interno, el elemento será el primero y el resultado será el mismo que con el otro método.

El método alternativo

Dejo aquí el post y el método original. La diferencia es que éste siempre devolverá la primera clave, con independencia de dónde esté el puntero del array.

Esta semana estoy trabajando en un sistema de autorización basado en reglas que me está trayendo de cabeza. Mientras tanto, este pequeño snippet me está resultando muy útil, he debido leerlo en algún sitio porque a mí solo no se puede ocurrir, pero no recuerdo dónde:

$modelName = array_shift(array_keys($model));

Extrae la clave del array de modelo, si tienes un array de datos de un modelo sin que tengas referencia a la clase ni forma de obtnerla. Algo del tipo:

$model = array('Modelo' => array('id' => 12312, 'name' => 'fede'));

El código extraerá correctamente 'Modelo' en $modelName, y ya lo puedes utilizar para lo que quieras.


6 comentarios:

José Lorenzo dijo...

Prueba haciendo esto:

$modelo = key($arreglo);

creo que funciona para lo que quieres y es más corto de escribir

José Lorenzo dijo...

Prueba haciendo esto:

$modelo = key($arreglo);

creo que funciona para lo que quieres y es más corto de escribir

Frankie dijo...

Gracias José, no había caído en la función key, por lo he añadido tu método al post.

jordicakephp dijo...

Hola,

Pues yo he utilizado este método que comentáis y funciona, claro. A modo de curiosidad, y ahora que leo este post, me he acordado de la forma en que Cake podría generar este nombre...

Hace un par de semanas me peleé con el inflector de Cake y creo que también se puede obtener el nombre del modelo a través del método estático singularize, pasando el nombre del controlador para que Cake lo singularice. Supongo que es así como llega el nombre del modelo al arreglo, jeje, ¿no?

Un saludo

Frankie dijo...

Sí, claro.

Frankie dijo...

Jordi, cuando estás en una acción del controlador éste ya está iniciado y "sabe" cuál es su modelo principal, cosa que puedes averiguar mirando en controller->modelClass (y en realidad en algún sitio más).

Otra cosa es cuando sólo tienes el nombre del controller y o bien asumes que el modelo se puede obtener con Inflector::singularize, o te las apañas para instanciar un controller, iniciarlo y obtener el modelo por el método anterior.

Y otra cosa (y de esta iba el post) sería obtener un nombre de modelo cuando sólo dispones de un array de datos del que sabes que es una estructura de datos de un modelo aunque no sabes de cuál.

El problema es siempre que aunque la asociación controller-model automática sea frecuente hay casos en el modelo principal de un controlador no es "el que le corresponde" y su nombre no se puede derivar del que tiene el controller. Y lo mismo ocurre al revés (cuando tienes el modelo y tienes que averiguar el controlador).

De todos modos, estos casos creo que se dan principalmente al programar behaviors, controllers o helpers, que deban ser genéricos y que, por tanto, no saben nada de la identidad de los controladores, modelos o vistas que manejan. Es un tema que estoy trabajando en un proyecto actual y he tenido que lidiar varias veces con el problema.