CakePHP: meilleure façon d'appeler une action d'un autre contrôleur avec tableau en tant que paramètre?

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

Question

Dans un contrôleur, ce qui est le moyen le plus approprié d'appeler l'action d'un autre contrôleur et aussi passer un tableau en tant que paramètre?

Je sais que vous pouvez utiliser requestAction pour appeler des actions dans d'autres contrôleurs. Mais est-il possible de passer des tableaux comme paramètres à l'aide de l'action demande?

Et non, je ne veux pas mettre l'action dans le App Controller. Donc, ce n'est pas une solution pour moi.

La seule autre façon que je connaisse est de charger l'autre contrôleur comme indiqué dans: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Mais est-il un moyen plus facile d'appeler simplement l'action d'autres contrôleurs en passant un tableau comme paramètre?

Je suis nouveau à CakePHP de sorte que toute suggestion est appréciée. Merci.

Était-ce utile?

La solution

Serait-il approprié pour vous déplacer la logique du second contrôleur dans son modèle, puis faire quelque chose comme ça dans l'action de votre premier contrôleur?

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

Ensuite, dans la vue de l'action du premier contrôleur, vous pouvez utiliser ces données.

J'essaie toujours de garder les méthodes de contrôleur aux actions que vous pouvez frapper à travers le navigateur, mettez autant de logique dans mes modèles, appeler des méthodes modèles étrangers d'actions de contrôleurs qui ont besoin de données à partir de modèles qui ne sont pas le modèle de ce contrôleur, puis utiliser ces données dans mon point de vue, et si ses données qui est souvent considéré, je crée un élément pour elle.

Autres conseils

Je ne conseille d'utiliser la méthode requestAction mais plutôt l'importation et instancier le contrôleur nécessaire.

CakePHP doc dit à propos requestAction que:

  

"Il est rarement approprié d'utiliser dans un   contrôleur, modèle "

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

Une fois que vous avez importé et chargé le contrôleur, vous pouvez appeler toute méthode de ce contrôleur avec ses paramètres.

<?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);
    }
  }
?>

de CakePHP 1.2.5, vous devriez être en mesure de transmettre différents types de paramètres par le second paramètre dans requestAction (). par exemple:.

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

Ensuite, dans le UsersController:

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

Au lieu d'utiliser « pass » ci-dessus, vous pouvez également essayer « forme » et « nom » pour passer forme / nommés respectivement paramètres.

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);
    }
}

Je mets dans ma classe AppController la méthode suivante et variable de sorte qu'il est caches en cas de plusieurs appels

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top