Смысл вот в чем. Разбить функционал на мелкие компоненты, а в билдере собирать из них сервис. Вот сейчас есть компонент коннекта Mysqli к примеру и есть компонент коннекта PDO. И есть третий, это дебаггер SQL. Так вот билдер собирает нужную конфигурацию. Берет дебаггер и передает его зависимостью в коннект. Из трех компонентов можно сделать два сервиса. Если добавить еще какой-нибудь, условно скажем SQLite (так не выйдет сейчас, адаптировать надо), то три сервиса из 4 компонентов. Ну и так далее.
Собирается все по общему принципу, в Closure. Но не помещается в конейнер сразу. А только при первом обращении. При следующием готовый сервис достается из контейнера уже.
Вот так билдер устроен:
@return
public function get()
{
if (!$this->locator->checkService($this->service)) {
$this->buildService();
}
return $this->locator->get($this->service);
}
@return
protected function buildService()
{
$component = '\ABC\abc\components\\'. $this->service .'\\'. $this->service;
$data = @$this->config[$this->service] ?: [];
$this->locator->setGlobal(
$this->service,
function() use ($component, $data) {
$data['debugger'] = isset($data['debug']) ? new SqlDebug(new View) : null;
return new $component($data);
}
);
}
На каждый сервис свой билдер.
Что я жду от этого, читай выше. :)
А ошибку выдаст процессор, зачем в каджый билдер совать исключения.
@return
public function getService($service = null)
{
if (empty($service) || !is_string($service)) {
throw new \InvalidArgumentException('Service name should be a string', E_USER_WARNING);
}
$builder = '\ABC\abc\builders\\'. $service .'Builder';
if (!class_exists($builder)) {
throw new \BadFunctionCallException('Service "'. $service .'" is not defined.', E_USER_WARNING);
}
$builder = new $builder;
$builder->config = $this->config;
$builder->locator = $this->locator;
return $builder->get($service);
}
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.