CakePhp: Melhor maneira de chamar uma ação de outro controlador com a matriz como parâmetro?

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

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.

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top