在控制器中,调用另一个控制器的操作并将数组作为参数传递的最合适方法是什么?
我知道你可以使用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的新手,所以任何建议都表示赞赏。感谢。
答案 0 :(得分:29)
我不建议使用requestAction方法,而是导入,并实例化所需的控制器。
CakePHP doc说的是requestAction:
“在a中使用很少是合适的 控制器或模型“
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);
}
}
?>
答案 1 :(得分:25)
您是否适合将逻辑从第二个控制器移动到其模型中,然后在第一个控制器的操作中执行类似的操作?
$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));
然后,在第一个控制器操作的视图中,您可以使用该数据。
我总是试图将控制器方法保持在可以通过浏览器访问的操作中,在模型中放置尽可能多的逻辑,从控制器操作调用外部模型方法,这些操作需要来自不是该控制器模型的模型的数据,然后在我的视图中使用该数据,如果是经常查看的数据,我会为它创建一个元素。
答案 2 :(得分:3)
从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'].
}
您可以选择'form'和'named'来分别传递form / named参数,而不是使用上面的'pass'。
答案 3 :(得分:3)
CakePHP 2.X:
{{1}}
答案 4 :(得分:-1)
我在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;
}