TGViewer
dev notes dev notes @junsenior · 1.39K subscribers
Post #201 1.22K
Как обычно мы биндим аргументы для сервиса в Symfony?
Правильно, через services.yaml. Например, мы создали интерфейс, у коготорого есть 3 реализации. Массив реализаций нам нужно передать куда-то в конструктор. У нас есть autowiring, и мы хотим его использовать. Переходим в services.yaml:

App\Service\SightingScorer:
arguments:
$scoringFactors:
- '@App\Scoring\TitleFactor'
- '@App\Scoring\DescriptionFactor'
- '@App\Scoring\CoordinatesFactor'

Где каждый из перечисленных классов реализует интерфейс ScoringFactorInterface.

Со временем реализаций становится всё больше, и всё больше вероятность, что при очередной деплое мы забудем обновить конфигурацию и прибиндить очередной класс. Так вот, ребята с symfonycast описали очень крутой способ, как биндить такие реализации автоматом. Идём в Kernel.php, там переопределяем метод build, и в нём добавляем одну строчку:
protected function build(ContainerBuilder $container)
{
parent::build($container);

$container->registerForAutoconfiguration(ScoringFactorInterface::class)
->addTag('scoring.factor');
}

Всё, после этого все реализации будут помечены тегом "scoring.factor", и в services.yaml нам достаточно один раз прописать:
App\Service\SightingScorer:
arguments:
$scoringFactors: !tagged_iterator scoring.factor

Такой подход называется тегированный итератор, и о нём можно почитать более подробно: https://symfony.com/doc/current/service_container/tags.html

Главное не забыть о том, что для того, чтобы автовайринг сработал нам нужно передавать аргументом итератор, а не массив:

private iterable $scoringFactors;

public function __construct(iterable $scoringFactors)
{
$this->scoringFactors = $scoringFactors;
}

Очень крутая штука, как по мне. И, в теории, что-то подобное можно реализовать и для других языков и фреймворков.
Symfony Service Tags (Symfony Docs) In Symfony applications, it's common that some services must be processed in a special way by the framework or by third-party bundles. For example, you may create a class that adds some custom filters…
More from @junsenior
  1. Sep 28, 2026Сошлись две вещи. Первая - мой проект safemap.ai, про который я уже писал выше - интеракти…
  2. Sep 17, 2026Post #356
  3. Sep 15, 2026Увидел тут в x.com статистику вакансий по PHP и статистику вакансий по hh.ru в целом. Я на…
  4. Sep 12, 2026Вдохновившись проектом, где делали интерактивную карту с тем, как работает Postgres (писал…
  5. Sep 8, 2026OpenAI выложили блогпост https://openai.com/index/navier-stokes-solution/ Мы публикуем реш…
  6. Sep 8, 2026Если кто не знал, вокруг этого сейчас разгорается очень большой скандал с OpenAI. Кратко,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →