我在CakePHP控制器中使用公共变量"uses"时遇到了一个巨大的问题。
我使用以下模式设置了我的应用程序。
PagesController扩展了AdminController,该AdminController扩展了AppController。
class PagesController extends AdminController
class AdminController extends AppController
我这么做是因为我还有一个ApiController,而不是AdminController,它在我的应用程序中用于(正如你所提到的)一个额外的API-层。
我使用这个包括额外的层
App::uses('AdminController', 'Controller');
在PagesController和中
App::uses('AppController', 'Controller');
在AdminController中。
这样对我来说效果很好。
编辑:
class AppController extends Controller {
public $uses = array('Print');
}
我想让一个名为"打印"的模型在我的每个儿童控制器中都可以访问。这就是为什么我在AppController 中初始化它
class PagesController extends AdminController {
public $uses = array('Article');
}
在PagesController中,我想使用"打印"-模型,此外还声明了"文章"-模型。在$uses变量的注释中,写下了子控制器中的每一个添加都将合并到父$uses可变项中。但它不起作用。它覆盖了它。
错误在哪里?请帮忙。
它工作正常:
AppController.php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $uses = array('Print');
public function test() {
echo 'AppController => ';
}
}
AdminController.php
App::uses('AppController', 'Controller');
class AdminController extends AppController {
public $uses = array('Photo');
public function test() {
parent::test();
echo 'AdminController';
if (is_subclass_of('AdminController', 'AppController')) {
echo ' (Subclass of AppController)';
}
echo ' => ';
}
}
PagesController.php
App::uses('AdminController', 'Controller');
class PagesController extends AdminController {
public $uses = array('Article');
public function test() {
parent::test();
echo 'PagesController';
if (is_subclass_of('PagesController', 'AdminController')) {
echo ' (Subclass of AdminController)';
}
if (is_subclass_of('PagesController', 'AppController')) {
echo ' (Subclass of AppController)';
}
}
public function index() {
self::test();
pr($this->uses);
exit;
}
}
/pages/index
AppController => AdminController (Subclass of AppController) => PagesController (Subclass of AdminController) (Subclass of AppController)
Array
(
[0] => Article
[1] => Print
)
Cake
只与一个控制器合并(默认为AppController
),而不是一直合并(AdminController->AppController->Controller
)。这就是为什么Pages
中没有Photo
模型的原因。
希望这能有所帮助。
编辑:您可以尝试从Pages, Admin, App
(以及两者之间的任何类)合并$uses
,如下所示:AppController.php
protected function _mergeControllerVars() {
parent::_mergeControllerVars();
$parent = get_parent_class($this);
while ($parent != 'Controller') {
$parentVars = get_class_vars($parent);
if (isset($parentVars['uses']) && $parentVars['uses'] !== true) {
$this->uses = array_merge(
$this->uses,
array_diff($parentVars['uses'], $this->uses)
);
}
$parent = get_parent_class($parent);
}
}
我认为您有语法问题,您可以尝试以下解决方案吗。请在您的控制器中写入以下代码:
public var $uses = array('Print');