Зарегистрировать определенный тип формы в Syfmony - Compiler Pass - PullRequest
0 голосов
/ 18 декабря 2018

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

. Поэтому я хотел создать проход компилятора, который мог бы зарегистрировать этот 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
Публичный номер
Синтетический номер
Ленивый нет
Общий да
Абстрактный нет
Автосоединение да
Автонастройка да


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

Когда я запускаю 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           
 --------------------------------------------------------------- ------- --------------------------------------------------------------- 

1 Ответ

0 голосов
/ 28 декабря 2018

Я нашел лучшее решение, чем использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...