Список всех-всех контроллеров
Понадобилось мне получить список всех контроллеров приложения, включая контроллеры плагинов. Configure::listObjects, увы, такого не умеет. Этот метод выдает только все контроллеры приложения, но без контроллеров плагинов. Пришлось немного адаптировать метод, предложенный Rob Weaver в гуглогруппе CakePHP. На выходе у моего метода получается объединенный список контроллеров. Основные — как отдает метод listObjects, а принадлежащие плагинам в виде «Plugin.Controller». Можно их поочередно скармливать сразу в App::import. Разве что выбрость те, названия которых на «App» заканчивается, если они не нужны. Будете загружать, помните, что класс «Controller» уже должен быть загружен.
Update. Метод Folder::findRecursive возвращал слишком много файлов, в том числе и ненужных. Переписал немного, теперь опрашиваем только директорию с плагином и его контроллерами.
/** * Lists the names of controllers including plugin controllers * * @return array */ static function listControllers() { App::import('Core', array('File', 'Folder')); $controllers = Configure::listObjects('controller'); $config = Configure::getInstance(); foreach ($config->pluginPaths as $pluginPath) { $folder = new Folder($pluginPath); list($plugin_dirs) = $folder->read(); foreach($plugin_dirs as $plugin_dir) { $pluginName = Inflector::camelize($plugin_dir); $folder->cd($pluginPath . $plugin_dir); $controllerFiles = $folder->find('.*_controller\.php'); $folder->cd(Folder::addPathElement($folder->path, 'controllers')); $controllerFiles = array_merge($controllerFiles,$folder->find('.*_controller\.php')); foreach ($controllerFiles as $file) { $file = basename($file); $controllers[] = $pluginName . '.' . Inflector::camelize(substr($file, 0, strlen($file)- strlen('_controller.php'))); } } } return $controllers; }



