Я создал конкретную форму Тип: 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
Теги 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, используя «bin / console debug: container», и убедитесь, что код передачи вашего компилятора вызывается с помощью простого оператора die.
Я нашел лучшее решение, чем использовать 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
Попробуйте обновить свой вопрос, добавив в него соответствующую часть сообщения об ошибке (если есть). Вы уже исключили OrganizationsForm из autowire? Почему вы делаете это абстрактным? Похоже, вам это совсем не нужно, если вы требуете, чтобы «все» имели псевдоним PreparatorInterface.