arrays cakephp parameters cakephp-1.3

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



parameters cakephp-1.3 (5)

¿Sería apropiado para usted mover la lógica del segundo controlador a su modelo, y luego hacer algo como esto en la acción de su primer controlador?

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

Luego, en la vista de la acción del primer controlador, puede usar esa información.

Siempre trato de mantener los métodos del controlador en acciones que puede ejecutar a través del navegador, poner tanta lógica en mis modelos, llamar métodos de modelos extranjeros desde acciones de controladores que necesitan datos de modelos que no son el modelo para ese controlador, luego usar esos datos en mi opinión, y si se trata de datos que se ven con frecuencia, creo un elemento para ello.

En un controlador, ¿cuál es la forma más adecuada de llamar a la acción de otro controlador y también pasar una matriz como parámetro?

Sé que puede usar requestAction para llamar acciones dentro de otros controladores. Pero, ¿es posible pasar matrices como parámetros mediante la acción de solicitud?

Y no, no quiero poner la acción en el controlador de la aplicación. Entonces esa no es una solución para mí.

La única otra forma que conozco 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

Pero, ¿hay una manera más sencilla de llamar a la acción de los otros controladores mientras se pasa una matriz como parámetro?

Soy nuevo en CakePHP por lo que cualquier sugerencia es apreciada. Gracias.


A partir de CakePHP 1.2.5, debe poder pasar varios tipos de parámetros a través del segundo parámetro en requestAction (). p.ej:

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

Luego en UsersController:

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

En lugar de usar ''pass'' arriba, alternativamente puede probar ''form'' y ''named'' para pasar los parámetros de forma / nombre 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); } }


No aconsejaría usar el método requestAction, sino importar, y crear una instancia del controlador necesario.

El documento de CakePHP dice acerca de requestAction que:

"Rara vez es apropiado usarlo en un controlador o modelo"

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

Una vez que haya importado y cargado 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); } } ?>


Puse en mi clase AppController el siguiente método y variable por lo que es caché 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; }