{ "name":"elfet/modular", "type":"library", "autoload": { "psr-0": { "Modular": "src/" } }, "require":{ "php":">=5.3.0", "elfet/ioc":"dev-master" } }
index.php - app/ app.ini - ModuleOne/ module.ini - ModuleTwo/
namespace Modular; use IoC\Container; use Composer\Autoload\ClassLoader; // /vendor/autoload.php class App { protected $rootDir; // app/ protected $ioc; // ioc protected $loader; // . public function __construct($rootDir, ClassLoader $classLoader) { $this->rootDir = $rootDir; $this->ioc = Container::getInstance(); $this->loader = new Loader($this->ioc, $classLoader); } public function load() { $appConfig = parse_ini_file($this->rootDir . '/app.ini', true); // app.ini // // . foreach ($appConfig as $module => $config) { // Modular\Module $config = array_merge(array( 'class' => 'Modular\Module', 'path' => $this->rootDir . '/module/' . $module, ), $config); // $this->loader->load( $module, $config['class'], $this->rootDir . '/' . $config['path'] ); } } public function run() { $this->load(); } }
public function load($moduleName, $moduleClass, $moduleDir) { // // ( PSR-0) $this->classLoader->add($moduleName, dirname($moduleDir)); // $module = new $moduleClass; $module->setModuleDir($moduleDir); // / IoC. // load // module.ini $module->load($this->ioc); }
namespace Modular; use IoC\Container; use IoC\Assoc\Service; class Module { private $moduleDir; // . public function load(Container $container) { $this->loadFromFile($container, $this->getModuleDir() . '/module.ini'); } protected function loadFromFile(Container $container, $file) { $module = parse_ini_file($file, true); foreach ($module as $class => $params) { // // IoC Reflection ( ). $interfaces = isset($params['interface']) ? (array)$params['interface'] : array(); // . unset($params['interface']); // - . // $class . // . $serviceAssoc = new Service($class, $params); $container->assoc($serviceAssoc, $interfaces); } } ... }
{ "require":{ "php":">=5.3.0", "elfet/modular":"dev-master" } }
namespace Notepad; interface StorageInterface { public function set($key, $value); public function get($key); public function save(); public function load(); }
namespace Notepad; use Notepad\StorageInterface; class FileStorage implements StorageInterface { protected $store = array(); protected $file; public function __construct($file = 'store.json') { $this->file = realpath(__DIR__ . '/../cache/' . $file); } public function set($key, $value) { $this->store[$key] = $value; } public function get($key) { return isset($this->store[$key]) ? $this->store[$key] : null; } public function save() { file_put_contents($this->file, json_encode($this->store)); } public function load() { $content = file_get_contents($this->file); $this->store = (array)json_decode($content); } }
[Notepad\FileStorage] interface = Notepad\StorageInterface file = store.json
public function __construct(StorageInterface $storage)
[MyNotepad\DbStorage] database = mystore.db
[Notepad] path = Notepad/ [MyNotepad] path = MyNotepad/
Source: https://habr.com/ru/post/149435/