0

我在使用 CakePHP-Controller 中的公共变量“uses”时遇到了一个大问题。

我使用以下架构设置了我的应用程序。

PagesController 扩展了一个扩展 AppController 的 AdminController。

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 中,我想使用“Print”-Model 以及声明的“Article”-Model。在 $uses-variable 的注释中写下了 Child-Controller 中的每个添加都将合并到 parent-$uses-variable 中。但它不这样做。它覆盖它。

错误在哪里?请帮忙。

4

2 回答 2

2

它工作正常:

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)。这就是为什么没有Photo模型Pages

希望这可以帮助。

编辑:您可以尝试$usesPages, Admin, App(以及之间的任何类)合并,如下所示: 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);
        }
    }
于 2014-04-16T20:51:42.470 回答
-1

我认为您有语法问题,您可以尝试以下解决方案。请在您的控制器中编写以下代码:

public var  $uses = array('Print');
于 2014-04-16T17:46:28.560 回答