27

在控制器中,调用另一个控制器的动作并将数组作为参数传递的最合适的方法是什么?

我知道您可以使用 requestAction 在其他控制器中调用操作。但是是否可以使用请求操作将数组作为参数传递?

不,我不想将操作放在 App Controller 中。所以这对我来说不是解决方案。

我知道的唯一其他方法是加载另一个控制器,如下所述: http ://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-组件行为视图和助手

但是有没有更简单的方法来调用其他控制器动作,同时将数组作为参数传递?

我是 cakePHP 的新手,所以任何建议都值得赞赏。谢谢。

4

5 回答 5

29

我不建议使用 requestAction 方法,而是导入并实例化所需的控制器。

CakePHP 文档关于 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);
    }
  }
?>
于 2009-10-02T11:11:12.963 回答
25

您是否适合将逻辑从第二个控制器移到其模型中,然后在您的第一个控制器的操作中执行类似的操作?

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

然后,在第一个控制器操作的视图中,您可以使用该数据。

我总是尝试将控制器方法保留在您可以通过浏览器点击的操作中,在我的模型中放置尽可能多的逻辑,从控制器调用外部模型方法,这些操作需要来自不是该控制器模型的模型的数据,然后使用该数据在我看来,如果是经常查看的数据,我会为它创建一个元素。

于 2009-10-02T19:46:27.797 回答
3

从 CakePHP 1.2.5 开始,您应该能够通过 requestAction() 中的第二个参数传递各种参数类型。例如:

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

然后在用户控制器中:

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

除了使用上面的“pass”之外,您还可以尝试使用“form”和“named”分别传递表单/命名参数。

于 2009-10-02T03:21:00.437 回答
3

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);
    }
}
于 2016-01-08T13:35:02.657 回答
-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;
}
于 2015-09-29T10:54:35.443 回答