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

Я создал определенный formType: OrganizationsType, Этот тип принимает 3 параметра в конструкторе. ThekenStorage (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
Теги 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
--------------------------------------------------------------- ------- ---------------------------------------------------------------

3

Решение

Я нашел лучшее решение, чем использовать 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector