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