Arrays CakePHP:用数组作为参数调用另一个控制器的操作的最佳方法?

Arrays CakePHP:用数组作为参数调用另一个控制器的操作的最佳方法?,arrays,cakephp,parameters,cakephp-1.3,Arrays,Cakephp,Parameters,Cakephp 1.3,在控制器中,调用另一个控制器的操作并将数组作为参数传递最合适的方法是什么 我知道您可以使用requestAction在其他控制器内调用操作。但是否可以使用请求操作将数组作为参数传递 不,我不想把动作放到应用程序控制器中。所以这不是我的解决方案 我知道的唯一其他方法是加载其他控制器,如中所述: 但是,在将数组作为参数传递时,是否有更简单的方法调用其他控制器操作 我是cakePHP的新手,因此任何建议都非常感谢。谢谢。从CakePHP 1.2.5开始,您应该能够通过requestAction()中

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

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

不,我不想把动作放到应用程序控制器中。所以这不是我的解决方案

我知道的唯一其他方法是加载其他控制器,如中所述:

但是,在将数组作为参数传递时,是否有更简单的方法调用其他控制器操作


我是cakePHP的新手,因此任何建议都非常感谢。谢谢。

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

然后在UsersController中:

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

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

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

CakePHP doc谈到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);
    }
  }
?>

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

$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));
然后,在第一个控制器操作的视图中,可以使用该数据


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

我将以下方法和变量放入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;
}
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);
    }
}

谢谢您的回复。是的,我听过关于你行动的谣言。不知道为什么不鼓励。无论如何,“导入”是另一种解决方案,谢谢。我同意,这是最好的,我一直在使用requestaction,但它很快就说明了为什么它不好,如果你需要传入一个包含基本文本以外的任何内容的字符串,它将无法正常工作,因为它使用url方法,因此它不能有特殊字符,如果你使用“/”在一个字符串中,htis将使用一个控制器动作将其分解为单独的变量,这在大型应用程序中非常常见。关于Cake是否会实现除requestAction之外的标准单个命令,甚至文档状态的性能都很差,是否有任何消息。很抱歉,这篇文章太老了,需要提问,但是在加载模型并使用它之后,是否有必要卸载它?定义的变量需要放在一个方法中,或者这个类构造函数。但除此之外,我认为这是一个比其他答案更干净的解决方案。谢谢伟大的我不确定我是否能做到。我会试试的。谢谢。好建议。我以前听说过一些关于将逻辑从控制器分离到模型的事情。但仍然不清楚这个概念。也许随着我对蛋糕有了更多的经验,我会有更清晰的了解。谢谢你的帮助。尼尔的想法是对的。控制器用于处理和委派传入请求。业务逻辑或代码应该主要在您的模型中。我不相信这是正确的,模型是用于数据库访问规则的,控制器处理所有其他事情,在大多数情况下,应用程序的大部分都在控制器中。。我不知道你说的“做事情的代码”是什么意思。。无论如何,IMO的最佳实践是将代码重用作为优先事项,因此理想情况下,许多内容应该放在控制器组件中,模型只用于数据验证等内容,在这些情况下,通常还应该制作成组件(在模型文件夹中)以供重用,我不同意。模特应该是胖瘦的。模型中应尽可能多地加入逻辑。您的控制器所要做的就是处理请求、处理会话、调用模型方法、为视图设置数据和处理用户流等。如果您发现在许多控制器中都在做同样的事情,那么请为其创建一个组件。顺便说一句,你知道你所评论的评论是由CakePHP的一位主要开发人员写的吗?“胖模型”的咒语并不是在其中扔任何东西和所有东西的理由。模型涉及数据检索和存储,任何使这些工作更容易的方法都属于模型。。。但就是这样。从技术上讲,无论是在控制器还是模型中,业务逻辑都不应该与CakePHP框架耦合。它应该存在于您自己的PHP“library”类中,控制器将其拉入范围并根据需要使用,但这是一种比您通常在Cake应用程序中看到的更高级的方法。哪个cakephp版本?你能添加它吗?你不可能已经测试过这个代码了。它确实会抛出语法错误。。评估:?当然
<?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);
    }
}