CakePHP: requestAction
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
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,
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.


