蛋糕PHP:以数组作为参数调用另一个控制器的操作的最佳方法?
-
19-09-2019 - |
题
在控制器中,调用另一个控制器的操作并传递数组作为参数的最合适方法是什么?
我知道您可以使用 requestAction 来调用其他控制器中的操作。但是是否可以使用请求操作将数组作为参数传递?
不,我不想将操作放入应用程序控制器中。所以这对我来说不是一个解决方案。
我知道的唯一其他方法是加载其他控制器,如下所述:http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers
但是有没有一种更简单的方法可以在传递数组作为参数的同时调用其他控制器操作?
我是 cakePHP 的新手,所以任何建议都会受到赞赏。谢谢。
解决方案
您将逻辑从第二个控制器移动到其模型中,然后在第一个控制器的操作中执行类似的操作是否合适?
$var = ClassRegistry::init('SecondModel')->myMethod($array);
$this->set(compact('var'));
然后,在第一个控制器操作的视图中,您可以使用该数据。
我总是尝试将控制器方法保留为您可以通过浏览器点击的操作,在我的模型中放入尽可能多的逻辑,从需要来自不是该控制器模型的模型的数据的控制器操作调用外部模型方法,然后使用该数据在我看来,如果是经常查看的数据,我会为其创建一个元素。
其他提示
我不会建议来使用的方法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);
}
}
?>
作为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'].
}
代替使用“通过”以上的,可以替代地尝试“形式”和“命名为”分别通过形式/命名参数。
的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;
}