SimpleMVC (реализация Dependency Injection)
Primary tabs
Пытаюсь реализовать дополнение к SimpleMVC: передать Dependency Injection через конструктор.
Я наверно не до конца понимаю как рабоет DI. Пытаюсь создать класс Container, который будет являться DI контейнером. Его потом можно перенести в отдельный файл и подключать где требуется.
В этом классе работать с $config, получать массив конфигурации. Сделать в этом классе свой метод getConfig():
class Container { public $config = null; public function __construct($config) { $this->config = $config; } public function getConfig() { return $this->config; } }
и далее связывать класс Container с классом Application при помощи конструктора:
public function __construct(Container $configData) { $this->configData = $configData; }
Не работает так у меня ничего. Помогите разобраться пожалуйста.) Если нужно еще что-то изучить дополнительно по теме, то готов изучить.
вот весь код моего файла: /var/www/SimpleMVC-example/vendor/it-for-free/simple-mvc/src/Application.php
<?php namespace ItForFree\SimpleMVC; use ItForFree\rusphp\PHP\ArrayLib\DotNotation\Dot; use ItForFree\SimpleMVC\exceptions\SmvcUsageException; use ItForFree\SimpleMVC\exceptions\SmvcConfigException; use ItForFree\rusphp\PHP\Object\ObjectFactory; /** * Класс-"точка входа" для работы фреймворка SimpleMVC * * Реализует паттерн "Одиночка" @see http://fkn.ktu10.com/?q=node/5572 */ class Container { public $config = null; public function __construct($config) { $this->config = $config; } public function getConfig() { return $this->config; } } class Application { /** * Массив конфигурации приложения * * @var ItForFree\rusphp\PHP\ArrayLib\DotNotation\Dot */ public $configData = null; /** * Cкрываем конструктор для того чтобы класс нельзя было создать в обход get() */ public function __construct(Container $configData) { $this->configData = $configData; } /** * Метод для получения текущего объекта приложения * * @staticvar type $instance * @return ItForFree\SimpleMVC\Applicaion объект приложения */ // public static function get() // { // static $instance = null; // статическая переменная // if (null === $instance) { // проверка существования // $instance = new static(); // } // return $instance; // } /** * Запускает приложение * * @param array $config Конфигурационный масиив приложения */ public function run() { if (!empty( $this->configData->getConfig() )) { $route = $this->getConfigObject('core.url.class')::getRoute(); /** * @var ItForFree\SimpleMVC\Router */ $Router = $this->getConfigObject('core.router.class'); $Router->callControllerAction($route); } else { throw new SmvcCoreException('Не задан конфигурационный массив приложения!'); } return $this; } /** * Устанавливает конфигурацию приложения из массива * * @param array $config многомерный массив конфигурации приложения * @return $this */ public function setConfiguration($configData) { $this->configData = new Dot($configData); return $this; } /** * Вернёт элемент из массива конфигурации приложения * * @param string $inConfigArrayPath ключ в виде строки, разделёной точками -- путь в массиве * @return mixed */ public function getConfigElement($inConfigArrayPath) { if (empty( $this->configData->getConfig() )) { throw new SmvcUsageException('Не задан конфигурационный массив приложения!'); } $configValue = $this->configData->getConfig($inConfigArrayPath); if (is_null($configValue)) { throw new SmvcConfigException("Элемент с данным путём [$inConfigArrayPath]" . " отсутствует в конфигурационном массиве приложения!"); } return $configValue; } /** * Создаст и вернёт объект по его имени из массива * * @param string $inConfigArrayPath ключ в виде строки, разделёной точками -- путь в массиве * @return mixed */ public function getConfigObject($inConfigArrayPath) { $configValue = self::getConfigElement($inConfigArrayPath); if (!class_exists($configValue)) { throw new SmvcConfigException("Вы запросили получение экземпляра класса " . "$configValue " . " (был добавлен в конфиг по адресу $configValue)," . " но такой класс не был ранее объеляен, " . "убедитесь чтобы его код подключен " . "до обращения к экземпляру объекта "); } return ObjectFactory::getInstanceOrSingletone($configValue); } }
- Log in to post comments
- 821 reads