CakePHP: requestAction

26.dic 2007 Envía un trackback

Dados dos controladores distintos -users_controller.php y cars_controller.php- dentro de la misma aplicación, supongamos que queremos cruzar información entre ellos. Por ejemplo dentro del controlador de cars queremos un listado con los datos del user al que pertenece.

Para ello creamos una función dentro de users_controller.php que sea la encargada de devolver los datos de un usuario seleccionado según $id:


function datos($id)
{
 // Si no se accede por un requestAction no funciona
 if(empty($this->params['requested'])) { exit; }
 // Devuelve los datos del usuario seleccionado según $id
 return $this->User->find('first',array('conditions' => array('User.id' => $id)));
}
 
Ahora solo nos queda llamar a esa función desde cars_controller y procesar la información para que quede accesible a nivel de vista, lo haremos con este código:
function listado($id)
{
 ...
 // Llamamos a la función datos() de users
 $datos = $this->requestAction('/users/datos/'.$this->Session->read('sid'));
 // Declaramos la variable que usaremos a nivel de vista
 $this->set('dataUser', $datos);
}
 
En este caso el parámetro $id lo sacamos de una variable de sesión. El uso básico de requestAction es sencillo y considero que con este ejemplo queda bien explicado.

Referencias

bake cakephp requestaction redirect

Comentarios
Gravatar Pablo Viojo@26.12.2007, 'Re: CakePHP: requestAction'

Si, se puede hacer de ese modo pero no es el optimo, ya que al hacer el requestAction cake vuelve a hacer todo el proceso de ruteo, manejo de parametros, instanciamiento del controlador, modelo etc. para la nueva petición.

En caso de querer utilizar una lógica perteneciente a un modelo relacionado con un modelo asociado al controlador en que está lo mejor es relacionar dichos modelos con la relación correspondiente y luego, desde cars por ejemplo, hacer algo del tipo:

$this->Car->User->find('first',array('conditions' => array('User.id' => $this->Session->read('sid'))));

Con eso obtienes el mismo resultado y la performance es mucho mejor.

Tambien podrías hacer lo mismo si User y Car no estuvieran relacionados haciendo que CarsController use el modelo User.

Saludos,

Gravatar r0sk@27.12.2007, 'Re: CakePHP: requestAction'

Genial tu aporte Pablo. En este caso concreto son modelos relacionados entre si, pero me parece más interesante el hecho de poder hacerlo aunque los modelos no estuvieran relacionados.


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]