CakePHP: лучший способ вызвать действие другого контроллера с массивом в качестве параметра? - PullRequest
27 голосов
/ 02 октября 2009

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

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

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

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

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

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

Ответы [ 5 ]

29 голосов
/ 02 октября 2009

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

CakePHP док говорит о запросе Action, что:

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

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);
    }
  }
?>
25 голосов
/ 02 октября 2009

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

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

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

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

3 голосов
/ 08 января 2016

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);
    }
}
3 голосов
/ 02 октября 2009

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

$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» для передачи параметров формы / имен соответственно.

0 голосов
/ 29 сентября 2015

Я поместил в свой класс 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;
}
...