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

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

Я знаю, что вы можете использовать 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, поэтому любое предложение приветствуется. Спасибо.

5 ответов


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

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

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

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


Я бы не советовал использовать метод requestAction, а скорее импортировать и создать экземпляр необходимого контроллера.

CakePHP doc говорит о requestAction, что:

" редко целесообразно использовать в контроллер или модель"

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

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

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

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

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

затем в UsersController:

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

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


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

я помещаю в свой класс 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;
}