Вопрос никак не связан непосредственно с PHP, просто приведу примеры на нем.
Предположим, что у нас есть некий объект конфигурации (синглтон), который содержит в себе все настройки нашего приложения:
$config = Config::getInstance();
$timezone = $config->get('timezone'); // получить настройку часового пояса
Также, есть класс-сервис, который имеет некие зависимости, которые берутся из конфигурации:
class MyService
{
/**
* @var string
*/
private $timezone;
/**
* @var string
*/
private $language;
}
Данный сервис будет создаваться с помощью DI-контейнера и будет существовать в единственном экземпляре (будет синглтоном). Есть два варианта инициализации свойств сервиса:
1. Мы передаем в конструктор класса весь объект конфигурации и получаем нужные свойства внутри конструктора:
public function __construct(Config $config)
{
$this->timezone = $config->get('timezone');
$this->language = $config->get('language');
}
2. Мы передаем в конструктор класса уже готовые значения параметров, предварительно получив их из конфигурации на уровне настроек DI-контейнера:
public function __construct($timezone, $language)
{
$this->timezone = $timezone;
$this->language = $language;
}
// И, где-нибудь в boot.php:
$di->setSingleton('my-service', function () {
$config = Config::getInstance();
$timezone = $config->get('timezone');
$language = $config->get('language');
return new MyService($timezone, $language);
});
Понятно, что в первом случае класс начинает зависеть от целого объекта конфигурации, но, зато у нас сильно уменьшается объем кода, относящегося к инициализации объектов в DI-контейнере, если настроек много.
Я видел на хабре статью на эту тему, но не могу ее найти, к сожалению.
Какой способ кажется вам предпочтительным, и, главное -
почему?