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