2009-10-02 9 views
27

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

So che è possibile utilizzare requestAction per chiamare azioni all'interno di altri controller. Ma è possibile passare array come parametri usando l'azione richiesta?

E no, non voglio mettere l'azione in App Controller. Quindi questa 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 per cakePHP quindi qualsiasi suggerimento è apprezzato. Grazie.

+0

Quale versione di cakephp? potresti aggiungerlo? –

risposta

24

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 controller?

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

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

Cerco sempre di mantenere i metodi del controllore sulle azioni che è possibile eseguire tramite il browser, inserire la logica nei miei modelli, chiamare i metodi del modello esterno dalle azioni dei controller che richiedono dati da modelli che non sono il modello per quel controller, quindi utilizzare tali dati nelle mie visualizzazioni e, se si tratta di dati che vengono visualizzati di frequente, creo un elemento per questo.

+0

buon suggerimento. Ho sentito parlare della separazione della logica dal controller al modello in precedenza. ma ancora non è chiaro su quel concetto. forse mentre guadagno più esperienza con la torta, otterrò un'immagine più chiara. Grazie per l'aiuto. – Vicer

+4

Neil ha l'idea giusta. I controllori sono destinati a gestire e delegare le richieste in arrivo. La logica aziendale o il codice che fa roba dovrebbero essere principalmente nei tuoi modelli. –

+1

Non credo che sia corretto, i modelli sono per le regole di accesso al database, i controller gestiscono tutto il resto, la maggior parte di un'applicazione sarebbe nel controller, nella maggior parte dei casi .. Non so cosa intendi per "codice" "In ogni caso, la migliore pratica IMO è quella di far riutilizzare il codice come una priorità, quindi idealmente molte cose dovrebbero essere inserite nei componenti del controller, il modello è usato solo per cose come la validazione dei dati, ecc. questi casi dovrebbero di solito anche essere trasformati in componenti (all'interno della cartella del modello) per il riutilizzo di questi pure – Rick

3

A partire da CakePHP 1.2.5, è possibile passare vari tipi di parametri tramite il secondo parametro in requestAction(). es .:

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

Poi nella UsersController:

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

Invece di utilizzare 'pass' sopra, in alternativa è possibile provare 'forma' e 'denominata' passare modulo/parametri denominati rispettivamente.

+0

Ottimo! non ero sicuro di poterlo fare. Lo proverò Grazie. – Vicer

+0

posso confermare che questo funziona – Mikelangelo

29

Non consiglierei di utilizzare il metodo requestAction ma piuttosto di importare e istanziare il controller necessario.

CakePHP doc dice di requestAction che:

"Raramente è opportuno utilizzare in un controllore o modello "

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

Una volta importato e caricato il controller che si può 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); 
    } 
    } 
?> 
+0

grazie per la vostra risposta. si ho sentito quella voce su requestAction. chiedo perché non è incoraggiato. Ad ogni modo, "Import" è una soluzione alternativa, grazie. – Vicer

+0

Sono d'accordo, questo è il migliore, stavo usando requestaction ma mostra rapidamente perché non è buono, se hai bisogno di passare una stringa che contiene qualcosa tranne il testo base non funzionerà correttamente, dal momento che usa il metodo url in modo non può avere caratteri speciali e se si utilizza "/" in una stringa htis lo spezzerà in variabili separate – Rick

+0

L'utilizzo di un'azione di un controller in un'altra è abbastanza comune in una grande app. Ci sono novità se Cake implementerà un singolo comando standard per farlo diverso da requestAction che anche gli stati della documentazione hanno scarse prestazioni. – Ryan

-1

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

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; 
} 
+0

È impossibile aver testato questo codice. Fa errori di sintassi ... Eval ..:? Sicuro? –

3

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