РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
726 of 1361 menu

Класс 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,
    который возвращает массив всех доступных сервисов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить