Класс ServiceLocator
Класс ServiceLocator реализует паттерн «локатор служб» и позволяет получать сервисы по их строковым идентификаторам. В отличие от контейнера, он содержит только заранее определённый набор сервисов и не выполняет их автоматическое создание. Конструктор принимает массив фабрик сервисов, где ключом является идентификатор, а значением - замыкание, возвращающее объект.
Синтаксис
use Symfony\Component\DependencyInjection\ServiceLocator;
$locator = new ServiceLocator([
'service_id' => function () {
return new SomeService();
},
]);
Пример
Давайте создадим локатор с одним сервисом и получим его:
<?php
namespace App\Service;
class MyService
{
public function greet(): string
{
return 'hello';
}
}
?>
<?php
namespace App\Controller;
use App\Service\MyService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\HttpFoundation\Response;
class LocatorController extends AbstractController
{
public function index(): Response
{
$locator = new ServiceLocator([
'my_service' => function () {
return new MyService();
},
]);
$service = $locator->get('my_service');
return new Response($service->greet());
}
}
?>
Результат выполнения кода:
hello
Пример
Давайте проверим наличие сервиса в локаторе с помощью метода has:
<?php
namespace App\Controller;
use App\Service\MyService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\HttpFoundation\Response;
class LocatorController extends AbstractController
{
public function index(): Response
{
$locator = new ServiceLocator([
'my_service' => function () {
return new MyService();
},
]);
$res = $locator->has('my_service') ? 'found' : 'not found';
return new Response($res);
}
}
?>
Результат выполнения кода:
"found"
Пример
Давайте получим список всех доступных сервисов с помощью метода getProvidedServices:
<?php
namespace App\Controller;
use App\Service\MyService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\HttpFoundation\Response;
class LocatorController extends AbstractController
{
public function index(): Response
{
$locator = new ServiceLocator([
'my_service' => function () {
return new MyService();
},
'other_service' => function () {
return new MyService();
},
]);
$services = $locator->getProvidedServices();
return new Response(implode(', ', array_keys($services)));
}
}
?>
Результат выполнения кода:
my_service, other_service
Смотрите также
-
класс
Container,
который управляет всеми сервисами приложения -
метод
get,
который возвращает сервис по его идентификатору -
метод
has,
который проверяет наличие сервиса в локаторе -
метод
getProvidedServices,
который возвращает массив всех доступных сервисов