CakePHP: bester Weg, um eine Aktion von einem anderen Controller mit Array als Parameter zu nennen?

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

Frage

In einem Controller, was ist der am besten geeignete Weg, um die Wirkung eines anderen Controller anzurufen und auch ein Array als Parameter übergeben?

Ich weiß, dass Sie request rufen Aktionen innerhalb anderen Controller verwenden können. Aber ist es möglich, Arrays als Parameter übergeben Anfrage Aktion mit?

Und nein, ich will nicht, die Aktion in der App Controller setzen. Das ist also keine Lösung für mich.

Die einzige andere Art, wie ich weiß, ist die anderen Controller zu laden, wie erklärt in: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Aber ist es ein einfacher Weg, nur die anderen Controller Aktion aufrufen, während ein Array als Parameter übergeben?

Ich bin neu in CakePHP so wird jeder Vorschlag geschätzt. Danke.

War es hilfreich?

Lösung

Wäre es sinnvoll sein, für Sie die Logik aus dem zweiten Controller in sein Modell zu bewegen, dann wie folgt in Ihrem ersten Controllers Aktion etwas tun?

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

Dann wird in der Ansicht für die Aktion des ersten Controller, können Sie diese Daten verwenden.

Ich versuche immer, Controller-Methoden zu Aktionen, um Sie über den Browser schlagen können, wie viel Logik in meine Modelle setzen, ausländische Modell Methoden von Controllern Aktionen aufrufen, die Daten von Modellen benötigen, die nicht das Modell für diesen Controller sind, dann verwenden sie diese Daten in meinen Ansichten, und wenn es Daten gibt, die häufig gesehen wird, erstelle ich ein Element für sie.

Andere Tipps

Ich würde nicht empfehlen die Methode request zu verwenden, sondern importieren und instanziiert die benötigte Controller.

CakePHP doc sagt über request, dass:

  

"Es ist selten angemessen in einem zu verwenden,   Controller oder das Modell "

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

Wenn Sie importiert und geladen, um den Controller, den Sie jede Methode dieses Reglers mit seinen Parametern aufrufen können.

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

Wie von CakePHP 1.2.5, sollten Sie in der Lage sein, verschiedene Parametertypen durch den zweiten Parameter in request () zu übergeben. z.

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

Dann in dem Userscontroller:

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

Statt über 'Pass' zu verwenden, können Sie alternativ versuchen, 'Form' und 'named' bzw. Form / benannte Parameter übergeben.

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

Ich habe in meine AppController Klasse die folgende Methode und Variable, so dass es Caches bei mehreren Anrufen

ist
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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top