";使用“-CakePHP控制器继承中的变量


"Uses"-Variable in CakePHP Controller inheritance

我在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');