arrays - CakePHP: лучший способ вызвать действие другого контроллера с массивом в качестве параметра?




3 Answers

Было бы уместно, чтобы вы переместили логику со второго контроллера в свою модель, а затем сделайте что-то подобное в действии вашего первого контроллера?

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

Затем, в представлении для действия первого контроллера, вы можете использовать эти данные.

Я всегда стараюсь, чтобы методы контроллера выполнялись с помощью браузера, добавляли столько логик в мои модели, вызывали методы внешней модели из действий контроллеров, которым нужны данные от моделей, которые не являются моделью для этого контроллера, а затем используют эти данные в моих представлениях, и если это часто просматриваемые данные, я создаю для него элемент.

В контроллере, что является наиболее подходящим способом вызова действия другого контроллера, а также передать массив в качестве параметра?

Я знаю, что вы можете использовать requestAction для вызова действий внутри других контроллеров. Но возможно ли передавать массивы в качестве параметров с помощью действия запроса?

И нет, я не хочу включать это действие в App Controller. Так что это не решение для меня.

Единственный другой способ, который я знаю, - загрузить другой контроллер, как описано в: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Но есть ли более простой способ просто вызвать действие других контроллеров при передаче массива в качестве параметра?

Я новичок в cakePHP, поэтому любое предложение оценивается. Благодарю.




Начиная с CakePHP 1.2.5, вы должны иметь возможность передавать различные типы параметров через второй параметр в requestAction (). например:

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

Затем в UserController:

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

Вместо использования «pass» выше вы также можете попробовать «form» и «named» для передачи форм / названных параметров соответственно.




Я включил в свой класс AppController следующий метод и переменную, так что это кеширование в случае множественных вызовов

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



Related

arrays cakephp parameters cakephp-1.3