С недавних пор, для разработки микро-сервисов на PHP, я не использую тяжелые фреймворки, а стараюсь делать все на независимых компонентах. Один из самых спорных моментов при построении приложения, это загрузка его составных компонентов. Один из самых простых способов сделать это, воспользоваться паттерном Service Locator. Для крупных приложений, возможно это не самый оптимальный вариант, но для небольших микро-сервисов я считаю его использование вполне оправданным.
Я написал свой базовый класс, который позволяет через вызов статических методов инициализировать Singleton объекты - сервисы.
Пример использования
echo App::view()->render('test');
Каждый сервис нужно определить как статическую функцию класса, который наследует ServiceLocator.
Пример инициализации 1
Инициализация сервиса по имени класса и параметрам передаваемым в конструктор.
public static function testService()
{
return static::getService(__FUNCTION__, TestService::class, [
'param1' => '1',
'param2' => '2'
]);
}
Пример инициализации 2
Вы можете использовать анонимные функции для инициализации сервисов.
public static function testService()
{
return static::getService(__FUNCTION__, function() {
$config = new TestConfig;
$service = new TestService($config);
$service->param1 = 'value 1';
return $service;
});
}
Пример инициализации 3
Если сервис имеет свою инициализацию, то можно просто вернуть его объект.
public static function testService()
{
return static::getService(__FUNCTION__, TestService::class, MyService::getInstance());
}
или
public static function testService()
{
return MyService::getInstance();
}
Ссылка на GitHub: github.com/denis909/php-service-locator
28.09.2019