Я работаю над проектом Cake PHP 2 и установил пользовательскую систему модулей, которая существует в app/modules/MyModule, в этом каталоге у меня есть такие папки, как:
Я добавил новый с именем Консоль и создал в нем каталог Command, куда я буду помещать команды.
Однако команда Console/cake существует в каталоге app/Console, а не в каталоге app/modules/MyModule/Console.
Как я могу иметь команды, которые существуют внутри того, что фактически является плагином, но выполняется из основного каталога Console/cake.
Моя настройка пользовательского модуля работает следующим образом:
<?php
App::uses('BaseModule', 'Modules');
App::uses('CakeEventManager', 'Event');
/**
* Helper class to load modules of a specific format from /app/modules directory,
* and create instances that can connect to system events, modify system behaviours etc.
*
* Usage:
*
* $_modules = new Modules();
$mods_arr = $_modules->initModules(ROOT.'/app/modules');
*
*
*/
class Modules
{
public function initModules($modules_base_dir)
{
$modules = array();
//loop over all directories in /app/modules/
foreach (new DirectoryIterator($modules_base_dir) as $dir)
{
if ($dir->isDot()) continue;
if ($dir->getFilename()=='.svn') continue;
if ($dir->isFile()) {
continue;
}
//compile a list of all modules, and load each Module class
$classname = $dir->getFilename();
App::import('modules/'.$classname, $classname);
$module = new $classname();
array_push($modules, $module);
//enumerate all events from BaseModule so we know what we need to handle
$base_events_array = array();
$methods = get_class_methods('BaseModule');
foreach($methods as $method)
{
//strip out any method that starts with "handle_"
if (substr($method, 0, 7)=='handle_')
{
$base_events_array[] = substr($method, 7);
}
}
//IF this module is enabled
if ($module->_enabled)
{
//register any EXISTING event handlers for this module
foreach($base_events_array as $event_name)
{
if (method_exists($module, 'handle_'.$event_name))
{
CakeEventManager::instance()->attach(array($module, 'handle_'.$event_name), $event_name);
}
}
//connect up any additional controllers,views, models, bootstraps from this module
App::build(array(
'Console' => array($modules_base_dir.'/'.$classname.'/Console/'),
'Controller' => array($modules_base_dir.'/'.$classname.'/Controller/'),
'View' => array($modules_base_dir.'/'.$classname.'/View/'),
'Model' => array($modules_base_dir.'/'.$classname.'/Model/'),
'Vendor' => array($modules_base_dir.'/'.$classname.'/Vendor/')
));
if (file_exists($modules_base_dir.'/'.$classname.'/bootstrap.php'))
{
include_once $modules_base_dir.'/'.$classname.'/bootstrap.php';
}
}
}
//die(var_dump(App::path('Controller')));
return $modules;
}
}






Вам нужно будет подключить подпространство имен/пакет, в котором CakePHP будет искать оболочки, т.е. Console/Command, и если у вас есть задачи, их тоже нужно будет подключить:
// ...
'Console/Command' => array("$modules_base_dir/$classname/Console/Command/"),
'Console/Command/Task' => array("$modules_base_dir/$classname/Console/Command/Task/"),
// ...
Вот и все! Спасибо за это
Почему не напрямую использовать плагины...?