&引用;使用「-CakePHP控制器继承中的变量
我在CakePHP控制器中使用公共变量“uses”时遇到了一个很大的问题&引用;使用「-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
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”-函数中完成,而不是在声明中,否则合并将无法正常工作。