CakePHP控制器继承中的“uses”变量

yws3nbqq  于 11个月前  发布在  PHP
关注(0)|答案(2)|浏览(170)

我在CakePHP控制器中使用公共变量uses时遇到问题。
我使用以下模式设置应用程序。
PagesController扩展了AdminControllerAdminController扩展了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');

}


我想在我的每个子控制器中创建一个名为“Print”的模型。
这就是为什么我在AppController中初始化它:

class PagesController extends AdminController {

    public $uses = array('Article');

}


PagesController中,我想使用“Print”模型,除了声明的“Article”模型之外。在$uses变量的注解中写道,子控制器中的每个加法都将合并到父$uses变量中。但它没有这样做。它覆盖了它。
错在哪里?

j0pj023g

j0pj023g1#

这个工作OK:
第一个月

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,如下所示:

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);
        }
    }

0vvn1miw

0vvn1miw2#

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

public var  $uses = array('Print');

字符串

相关问题