CakePHP: la mejor manera de llamar a una acción de otro controlador con array como parámetro?

StackOverflow https://stackoverflow.com/questions/1507552

Pregunta

En un controlador, lo que es la forma más adecuada para llamar a la acción de otro controlador y también pasar un array como parámetro?

Yo sé que se puede utilizar para llamar requestAction acciones dentro de otros controladores. Pero, ¿es posible pasar matrices como parámetros utilizando la acción petición?

Y no, no quiero poner la acción en el App Controller. Así que no es una solución para mí.

La única otra manera que sé es cargar el otro controlador como se explica en: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Sin embargo, hay una manera más fácil simplemente llamar a la acción de otros controladores al pasar una matriz como parámetro?

Soy nuevo en CakePHP por lo que se agradece cualquier sugerencia. Gracias.

¿Fue útil?

Solución

¿Sería apropiado para que se mueva la lógica del segundo controlador en su modelo, a continuación, hacer algo como esto en la acción de su primer controlador?

$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));

A continuación, en la vista de la acción del primer controlador, puede utilizar esos datos.

Siempre trato de mantener los métodos de controlador para las acciones que puede golpear a través del navegador, poner tanta lógica en mis modelos, llamar a métodos del modelo de extranjeros de acciones controladores que necesitan datos de los modelos que no son el modelo para ese controlador, a continuación, utilizar esos datos en mis puntos de vista, y si se trata de datos que se ve con frecuencia, se crea un elemento de la misma.

Otros consejos

No aconsejaría a utilizar el método de requestAction sino más bien de importación, y una instancia del controlador necesario.

CakePHP doc dice acerca requestAction que:

  

"Rara vez es apropiado utilizar en una   controlador o modelo "

http://book.cakephp.org/view/434 / requestAction

Una vez que ha importado y se carga el controlador puede llamar a cualquier método de este controlador con sus parámetros.

<?php
  //Import controller
  App::import('Controller', 'Posts');

  class CommentsController extends AppController {
    //Instantiation
    $Posts = new PostsController;
    //Load model, components...
    $Posts->constructClasses();

    function index($passArray = array(1,2,3)) {
      //Call a method from PostsController with parameter
      $Posts->doSomething($passArray);
    }
  }
?>

A partir de CakePHP 1.2.5, debe ser capaz de pasar varios tipos de parámetros a través del segundo parámetro en requestAction (). por ejemplo:.

$this->requestAction('/users/view', array('pass' => array('123')));

A continuación, en el UsersController:

function view($id) {
    echo $id; // should echo 123 I believe, otherwise try $this->params['pass'].
}

En lugar de utilizar 'pase' anterior, se puede tratar alternativamente 'forma' y 'llamada' para pasar de forma / parámetros nombrados, respectivamente.

CakePHP 2.X:

<?php
App::uses('AppController', 'Controller');
App::uses('PostsController', 'Controller');

class CommentsController extends AppController {

    public function index($parameter = null){
        //Instantiate
        $Posts = new PostsController();
        //Load model, components...
        $Posts->constructClasses();

        //Call a method of Posts passing a parameter
        $Posts->aMethod($parameter);
    }
}

he puesto en mi clase AppController el siguiente método y variable, por lo que es cachés en caso de múltiples llamadas

var $controllersArray = array();

function _getController( $pControllerName ){
    if ( ! isset($this->controllersArray[$pControllerName]) ){
        $importRes = App::import('Controller', $pControllerName);// The same as require('controllers/users_controller.php');
        $strToEval = "\$controller = new ".$pControllerName."Controller;";
        $evalRes = eval($strToEval);
        if ( $evalRes === false ){
            throw new AppException("Error during eval of given getController '$pControllerName'");
        }
        $controller->constructClasses();// If we want the model associations, components, etc to be loaded
        $this->controllersArray[$pControllerName] = $controller;
    }
    $result = $this->controllersArray[$pControllerName];

    return $result;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top