Domanda

In un controller, qual è il modo più appropriato per chiamare l'azione di un altro controllore e anche passare un array come parametro?

Lo so che è possibile utilizzare per chiamare requestAction azioni all'interno di altri controllori. Ma è possibile passare le matrici come parametri utilizzando richiesta di azione?

E no, io non voglio mettere l'azione nel Controller App. In modo che non è una soluzione per me.

L'unico altro modo che conosco è quello di caricare l'altro controller come spiegato in: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Ma c'è un modo più semplice per chiamare solo l'azione altri controller durante il passaggio di un array come parametro?

Sono nuovo di cakePHP quindi ogni suggerimento è apprezzato. Grazie.

È stato utile?

Soluzione

Sarebbe opportuno per voi di spostare la logica dal secondo controller nel proprio modello, quindi fare qualcosa di simile in azione la vostra prima del controllore?

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

Poi, nella vista per l'azione del primo controllore, è possibile utilizzare tali dati.

cerco sempre di mantenere i metodi di controller per azioni che si possono colpire attraverso il browser, mettere tanto logica nei miei modelli, chiamare i metodi modello stranieri provenienti da azioni controllori che hanno bisogno di dati da precedenti modelli che non sono il modello per tale controller, quindi utilizzare tali dati in mio punto di vista, e se è i dati che è visto spesso, creo un elemento per esso.

Altri suggerimenti

Non vorrei consigli per utilizzare il metodo requestAction ma piuttosto di importazione, e un'istanza del controllo necessario.

CakePHP doc dice di requestAction che:

  

"Raramente è opportuno utilizzare in un   Controller o il modello "

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

Una volta importato e caricato il controller è possibile chiamare qualsiasi metodo di questo controller con i suoi parametri.

<?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 partire dal CakePHP 1.2.5, si dovrebbe essere in grado di passare i vari tipi di parametri attraverso il secondo parametro in requestAction (). per esempio:.

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

Poi nel UsersController:

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

Invece di usare 'PASS' sopra, in alternativa è possibile provare 'forma' e 'chiamato' a passare di forma / parametri denominati rispettivamente.

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

ho messo nella mia classe AppController il seguente metodo e variabile per cui è cache in caso di chiamate multiple

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top