рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓, рдореЙрдбреНрдпреВрд▓рд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрдЧрдарди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рдореЙрдбреНрдпреВрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдЙрд▓рдЯрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧреАред рд╣рдо IoC рдХрдВрдЯреЗрдирд░реЛрдВ рдФрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЪрд▓реЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓рд░ рдХрд╣рд╛ред

рдкрд╣рд▓реЗ рд╣рдо рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
{ "name":"elfet/modular", "type":"library", "autoload": { "psr-0": { "Modular": "src/" } }, "require":{ "php":">=5.3.0", "elfet/ioc":"dev-master" } } 

рдЕрдм рдЬрд╣рд╛рдВ рд╣рдо "рдореЙрдбреНрдпреВрд▓рд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рдо IoC рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧреА:
 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); } } ... } 


рдЕрдм рдЖрдЗрдП рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдлрд┐рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдПрдХ рдиреЛрдЯрдмреБрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рд╕рд╛рд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдХрдВрдкреЛрдЬрд╝рд░ рдмрдирд╛рдПрдБред Json:
 { "require":{ "php":">=5.3.0", "elfet/modular":"dev-master" } } 


рдФрд░ рдХрдВрдкреЛрдЬрд╝рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдЪрд▓рд╛рдПрдВред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдВрдбрд░ / рдлреЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдиреЛрдЯрдкреИрдб / рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ StorageInterface рд╕рдВрдЧреНрд░рд╣рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ:
 namespace Notepad; interface StorageInterface { public function set($key, $value); public function get($key); public function save(); public function load(); } 


рдФрд░ FileStorage рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреАред
рдХреЛрдб
 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 


рдЕрдм, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреЛрдЯрдкреИрдб \ рдирд┐рдпрдВрддреНрд░рдХ ) рдЬрд┐рд╕рдореЗрдВ рд╕реЗ StorageInterface рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ, рдХреЛ рдПрдХ FileStore рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛:
 public function __construct(StorageInterface $storage) 


рд╕рднреА рдиреЛрдЯрдкреИрдб рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рдЖрдЗрдП MyNotepad рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдиреЛрдЯрдкреИрдб рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдм рд╣рдо DbStorage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди / MyNotepad / DbStorage.php рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / MyNotepad / рдореЙрдбреНрдпреВрд▓.in.in рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░реЗрдВ:
 [MyNotepad\DbStorage] database = mystore.db 


рдФрд░ app.ini рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВ
 [Notepad] path = Notepad/ [MyNotepad] path = MyNotepad/ 


рдЕрдм, рдиреЛрдЯрдкреИрдб \ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╕рдордп MyNotepad \ DbStorage рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдмрд╕ рдЗрд╕реА рддрд░рд╣, рдиреЛрдЯрдкреИрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рд╣рдордиреЗ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ред рдЧрд┐рддреБрдм рдкрд░, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдЯрдкреИрдб рдХреЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╢реЙрд░реНрдЯрдХрдЯ


Source: https://habr.com/ru/post/In149435/


All Articles