Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;使用「-CakePHP控制器继承中的变量_Php_Oop_Cakephp_Uses - Fatal编程技术网

&引用;使用「-CakePHP控制器继承中的变量

&引用;使用「-CakePHP控制器继承中的变量,php,oop,cakephp,uses,Php,Oop,Cakephp,Uses,我在CakePHP控制器中使用公共变量“uses”时遇到了一个很大的问题 class PagesController extends AdminController class AdminController extends AppController 我使用以下模式设置我的应用程序 PagesController扩展了AdminController,后者扩展了AppController class PagesController extends AdminController class

我在CakePHP控制器中使用公共变量“uses”时遇到了一个很大的问题

class PagesController extends AdminController 
class AdminController extends AppController
我使用以下模式设置我的应用程序

PagesController扩展了AdminController,后者扩展了AppController

class PagesController extends AdminController 
class AdminController extends AppController
我这样做是因为我还得到了一个ApiController,而不是AdminController,它用于(正如您所提到的)我的应用程序中的一个附加API层

我通过使用这个函数包含附加层

 App::uses('AdminController', 'Controller');
在页面控制器和

App::uses('AppController', 'Controller');
在AdminController中

class PagesController extends AdminController 
class AdminController extends AppController
这样对我来说很好

编辑:

我希望在我的每个子控制器中都能访问一个名为“Print”的模型。 这就是我在AppController中初始化它的原因

class PagesController extends AdminController {

    public $uses = array('Article');

}
在PagesController中,我想使用“Print”模型,另外还声明了“Article”模型。在$uses变量的注释中写下,子控制器中的每个添加都将合并到父级-$uses变量中。 但事实并非如此。它会覆盖它


错在哪里?请帮助。

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

public var  $uses = array('Print');
它工作正常:

AppController.php

App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $uses = array('Print');
    public function test() {
        echo 'AppController => ';
    }
}
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 ' => ';
    }
}
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;
    }
}
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);
        }
    }
AdminController.php

App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $uses = array('Print');
    public function test() {
        echo 'AppController => ';
    }
}
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 ' => ';
    }
}
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;
    }
}
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);
        }
    }
PagesController.php

App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $uses = array('Print');
    public function test() {
        echo 'AppController => ';
    }
}
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 ' => ';
    }
}
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;
    }
}
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);
        }
    }
/pages/index

AppController => AdminController (Subclass of AppController) => PagesController (Subclass of AdminController) (Subclass of AppController)
Array
(
    [0] => Article
    [1] => Print
)
Cake
仅与一个控制器(
AppController
by)合并,而不是全部合并(
AdminController->AppController->controller
)。 这就是为什么在
页面
中没有
照片
模型的原因

希望这有帮助

编辑: 您可以尝试从
页面、管理员、应用程序(以及两者之间的任何类)合并
$uses
,如下所示:
AppController.php

App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $uses = array('Print');
    public function test() {
        echo 'AppController => ';
    }
}
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 ' => ';
    }
}
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;
    }
}
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$uses包含在控制器中设置的要在那里使用的表模型*示例:
public$uses=array('Product','Post','Comment')
*App::uses只是添加其他php类的静态调用。我真的不明白你的问题,但有一件事要提,Cakephp有一个默认的
PagesController
public$uses=array()。因此,我认为如果你不在你的子控制器上提到
public$uses
,它将采用默认的
$uses
…我在这里的示例中使用了PagesController,在我的代码中有很多其他控制器也有同样的问题。你可以使用
$this->loadModel('Article'))
在PagesController中,仍然可以使用
$this->Article
。我也遇到了同样的问题,并做了类似的解决办法。自PHP5.0以来,var关键字一直被弃用,它在PHP中不再具有功能性用途,只支持向后兼容。我的朋友,我使用的是PHP5.4版,它运行得很好。Sir,它很有效,因为它保留下来是为了支持旧的应用程序。它不再是正确的语法,不应在新代码中使用。请参阅本页物业可见性标题下的“备注”部分:帅哥。竖起大拇指你是说这个为什么竖起大拇指?AppController->AdminController->Controller?你有没有办法将那些在AdminController下特别使用的模型合并到uses变量中?我已经在我的答案中添加了_mergeControllerVars,但它需要测试。非常感谢。对“组件”进行同样的操作有一个问题。这些初始化必须在“initialize”-函数中完成,而不是在声明中,否则合并将无法正常工作。