web-dev-qa-db-fra.com

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

Dans un contrôleur, quelle est la façon la plus appropriée d'appeler l'action d'un autre contrôleur et de passer également un tableau en paramètre?

Je sais que vous pouvez utiliser requestAction pour appeler des actions au sein d'autres contrôleurs. Mais est-il possible de passer des tableaux en tant que paramètres en utilisant l'action de demande?

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

La seule autre façon que je connaisse est de charger l'autre contrôleur comme expliqué dans: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing- contrôleurs-modèles-composants-comportements-vues-et-aides

Mais existe-t-il un moyen plus simple d'appeler simplement l'action des autres contrôleurs tout en passant un tableau en paramètre?

Je suis nouveau sur cakePHP donc toute suggestion est appréciée. Merci.

27
Vicer

Serait-il approprié pour vous de déplacer la logique du deuxième contrôleur dans son modèle, puis de 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 du contrôleur pour les actions que vous pouvez exécuter via le navigateur, de mettre autant de logique dans mes modèles, d'appeler les méthodes de modèle étrangères des actions des contrôleurs qui ont besoin de données de modèles qui ne sont pas le modèle de ce contrôleur, puis d'utiliser ces données dans mes vues, et si ce sont des données qui sont consultées fréquemment, je crée un élément pour cela.

25
neilcrookes

Je ne conseillerais pas d'utiliser la méthode requestAction mais plutôt d'importer et d'instancier le contrôleur nécessaire.

Le doc de CakePHP dit à propos de requestAction que:

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

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

Une fois que vous avez importé et chargé le contrôleur, vous pouvez appeler n'importe quelle 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);
    }
  }
?>
29
Schaoulli

Depuis CakePHP 1.2.5, vous devriez être capable de passer différents types de paramètres via le second paramètre dans requestAction (). par exemple.:

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

Puis 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 'form' et 'named' pour passer respectivement les paramètres form/named.

3
Matt Huggins

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