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
- 1268 reads