CakePhp: Melhor maneira de chamar uma ação de outro controlador com a matriz como parâmetro?
-
19-09-2019 - |
Pergunta
Em um controlador, qual é a maneira mais apropriada de chamar a ação de outro controlador e também passar uma matriz como parâmetro?
Eu sei que você pode usar o RequestAction para chamar ações em outros controladores. Mas é possível passar as matrizes como parâmetros usando a ação de solicitação?
E não, eu não quero colocar a ação no controlador de aplicativos. Então isso não é uma solução para mim.
A única outra maneira que eu sei é carregar o outro controlador, conforme explicado em:http://book.cakephp.org/1.3/en/the-manual/develop-with-cakephp/configuration.html#importing-controllers-models-comments-behaviors-views-and-helpers
Mas existe uma maneira mais fácil de chamar a ação dos outros controladores ao passar uma matriz como parâmetro?
Eu sou novo no CakePHP, então qualquer sugestão é apreciada. Obrigado.
Solução
Seria apropriado você mover a lógica do segundo controlador para o modelo e depois fazer algo assim na ação do seu primeiro controlador?
$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));
Então, na visualização da ação do primeiro controlador, você pode usar esses dados.
Eu sempre tento manter os métodos do controlador para as ações que você pode acertar através do navegador, colocar o máximo de lógica em meus modelos, chamar métodos de modelos estrangeiros de ações controladoras que precisam de dados de modelos que não são o modelo para esse controlador e, em seguida, uso esses dados Nos meus pontos de vista, e se são dados que são visualizados com frequência, eu crio um elemento para ele.
Outras dicas
Eu não aconselharia a usar o método RequestAction, mas importar e instanciar o controlador necessário.
CakePhp Doc diz sobre o RequestAction que:
"Raramente é apropriado usar em um controlador ou modelo"
http://book.cakephp.org/view/434/requestaction
Depois de importar e carregar o controlador, você pode chamar qualquer método desse controlador com seus 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 do CakePHP 1.2.5, você poderá passar vários tipos de parâmetros através do segundo parâmetro no requestAction (). por exemplo:
$this->requestAction('/users/view', array('pass' => array('123')));
Então, no UsuáriosController:
function view($id) {
echo $id; // should echo 123 I believe, otherwise try $this->params['pass'].
}
Em vez de usar o 'Pass' acima, você pode tentar, alternativamente, 'formulário' e 'nomeado' para passar os parâmetros de forma/nomeado, 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);
}
}
Coloquei na minha classe AppController o seguinte método e variável para que sejam os caches no caso de várias chamadas
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;
}