Зарегистрируйте определенный тип формы в Syfmony - Compiler Pass

Я создал конкретную форму Тип: OrganizationsType. Этот тип принимает в конструкторе 3 параметра. TokenStorage (TokenStorageInterface), Маршрутизатор (Router) и объект интерфейса из моего класса (PreparatorInterface). Эта форма находится внутри пакета, и я хочу, чтобы каждый создал свой собственный Preparator, реализовав PreparatorInterface.

Поэтому я хотел создать проход Compiler, который мог бы зарегистрировать этот FormType со всеми параметрами. Я пробую это:

$organizationListPreparator = $container->findTaggedServiceIds(self::TAG);

    if (empty($organizationListPreparator)) {
        throw new \Exception('CoffreoProOrganizationSelectorBundle need a preparator. Check README.');
    }

$container->register(OrganizationsForm::class, OrganizationsForm::class)
        ->addArgument(new Reference('security.token_storage'))
        ->addArgument(new Reference(key($organizationListPreparator)))
        ->addArgument(new Reference('router'))
        ->setAutoconfigured(true)
        ->setAutowired(true)
        ->setAbstract(true)
        ->addTag('form.type');

Но когда я пытаюсь создать такую ​​форму,

$organizationsForm = $this->createForm(OrganizationsForm::class);

Как я могу сделать что-то подобное?

Редактировать

Я получаю это сообщение об ошибке:

Too few arguments to function OrganizationSelectorBundle\Form\OrganizationsForm::__construct(), 0 passed in /var/www/myProject/vendor/symfony/form/FormRegistry.php on line 92 and exactly 3 expected

[2018-12-18 16:34:38] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalThrowableError: "Too few arguments to function OrganizationSelectorBundle\Form\OrganizationsForm::__construct(), 0 passed in /var/www/myProject/vendor/symfony/form/FormRegistry.php on line 92 and exactly 3 expected" at /var/www/myProject/vendor/organization-selector-bundle/Form/OrganizationsForm.php line 58 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Too few arguments to function OrganizationSelectorBundle\\Form\\OrganizationsForm::__construct(), 0 passed in /var/www/myProject/vendor/symfony/form/FormRegistry.php on line 92 and exactly 3 expected at /var/www/myProject/vendor/organization-selector-bundle/Form/OrganizationsForm.php:58)"} []

Редактировать

Когда я запускаю bin/console deb:container OrganizationForm

Информация для сервиса "OrganizationSelectorBundle \ Form \ OrganizationsForm"


Значение параметра


Идентификатор службы OrganizationSelectorBundle \ Form \ OrganizationsForm
Класс OrganizationSelectorBundle \ Form \ OrganizationsForm
Теги form.type
Публичный no
Синтетический no
Ленивый нет Поделиться да Реферат no
Автопроводка да
Автоматическая настройка да


Я передаю свой проход компилятора, когда добавляю дамп («Я прошел здесь?»); умри();

Когда я запускаю bin/console debug:container --tag form.type, чтобы отобразить все службы с тегом form.type

Symfony Container Services Tagged with "form.type" Tag
======================================================

 --------------------------------------------------------------- ------- --------------------------------------------------------------- 
  Service ID                                                      alias   Class name                                                     
 --------------------------------------------------------------- ------- --------------------------------------------------------------- 
  App\Form\StaffingCustomerType     App\Form\StaffingCustomerType                                  
  App\Form\UserType                 App\Form\UserType                                              
 OrganizationSelectorBundle\Form\OrganizationsForm      OrganizationSelectorBundle\Form\OrganizationsForm           
 --------------------------------------------------------------- ------- --------------------------------------------------------------- 

Попробуйте обновить свой вопрос, добавив в него соответствующую часть сообщения об ошибке (если есть). Вы уже исключили OrganizationsForm из autowire? Почему вы делаете это абстрактным? Похоже, вам это совсем не нужно, если вы требуете, чтобы «все» имели псевдоним PreparatorInterface.

Cerad 18.12.2018 16:29

Хорошо. Теперь убедитесь, что у вас нет службы OrganizationsForm, используя «bin / console debug: container», и убедитесь, что код передачи вашего компилятора вызывается с помощью простого оператора die.

Cerad 18.12.2018 19:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел лучшее решение, чем использовать CompilerPass.

Я использую непосредственно определение службы в yaml и передаю в качестве второго аргумента конкретную службу if. Затем я предоставляю службу по умолчанию для этого идентификатора службы, используя псевдоним:

OrganizationSelectorBundle\Form\OrganizationsForm:
    arguments:
      - '@security.token_storage'
      - '@coffreo_organization_bundle.organization_list_preparator'
      - '@router'
    tags: [form.type]
    public: false

coffreo_organization_bundle.organization_list_preparator:
    class: Coffreo\Pro\OrganizationSelectorBundle\Preparator\AllOrganizationListPreparator
    arguments: ['@translator']
    public: false

Другие вопросы по теме