oop — PHP MVC: Config класс как зависимость или только с константами класса, доступными из общего?

В моем проекте MVC (PHP 7.1) у меня есть Config класс и множество конфигурационных файлов, каждый из которых выглядит следующим образом:

return [
'web' => [
'host' => 'localhost',
//...
],
];

В точке входа в приложение я делаю экземпляр Config Класс и загрузить все массивы файла конфигурации в нем. Созданный объект затем передается в качестве аргумента конструктора во все классы, которым это необходимо:

class AbstractView {

private $config;

public function __construct(Config $config) {
$this->config = $config;
}

private function prepareContext() {
$this->assign('appHost', $this->getConfig()->get('web/host'));
}

}

Потому что это довольно «большое усилие», чтобы пройти Config объект довольно общий в моем приложении, я подумал о реализации Config класс только с константами класса, например:

class Config {

const WEB_PROTOCOL = 'http';
const WEB_HOST = 'localhost';

}

и получить к ним доступ в целом напрямую с

class AbstractView {

private function prepareContext() {
$this->assign('appHost', Config::WEB_HOST);
}

}

Мои вопросы:

  1. Это действительно хорошая альтернатива, имея в виду, что я хочу
    полностью избежать статических состояний в моем приложении?
  2. Является ли эта альтернатива «статичной» или нет?
  3. А как насчет тестируемости (у меня пока нет с этим опыта)?

Большое спасибо.

0

Решение

Если вы намереваетесь протестировать этот код, это будет довольно сложно, потому что вам нужно будет предоставить собственные автозагрузчики для каждого варианта, который вы хотите протестировать (ну, вы могли бы также использовать один автозагрузчик, который имеет некоторые статические методы). за то, что повесил это поведение). Это сделает весь юнит-тестирование чем-то вроде кошмара.

На вашей позиции я бы пошел в другом направлении: попытка разделения конфигураций. Кажется, что вы передаете всю конфигурацию, даже если экземпляр будет использовать только одно или два значения из нее.

Этот подход приводит к скрытым зависимостям, которые производят высокосвязанный код, где вы на самом деле не знаете, что необходимо для охвата ваших экземпляров.

Рекомендация

Начните использовать DI-контейнер в вашем коде.

Это позволит вам разгрузить большую часть конфигурации, потому что некоторые «параметры», которые вы извлекаете из конфигурации, могут передаваться как прямые зависимости в конструкторах.

И использовать волшебный Config экземпляр, где DIC не является чистой опцией. Хотя вы, вероятно, должны использовать несколько Config экземпляры, каждый из которых представляет часть настроек, которые используются вместе.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector