And it works ok:
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
merges only with one controller (AppController
by default), not all the way up (AdminController->AppController->Controller
).
That's why there is no Photo
model in Pages
.
Hope this helps.
EDIT:
You can try to merge $uses
from Pages, Admin, App
(and any class between) like this:
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);
}
}