我遇到了一个奇怪的错误。我在自己的系统中实现了Form组件。在那里我创建了一个FormType,其中我使用EntityType作为字段。每次我想用formBuilder创建表单时,它都会抛出以下错误:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function
Symfony\Bridge\Doctrine\Form\Type\DoctrineType::__construct(), 0 passed in
vendor/symfony/form/FormRegistry.php on line 92 and exactly 1 expected in
vendor/symfony/doctrine-bridge/Form/Type/DoctrineType.php:102
有人知道为什么会这样吗?
附加信息:
composer软件包版本:
abraham/twitteroauth 0.7.4
doctrine/annotations v1.6.0
doctrine/cache v1.7.1
doctrine/collections v1.5.0
doctrine/common v2.8.1
doctrine/dbal v2.6.3
doctrine/inflector v1.3.0
doctrine/instantiator 1.1.0
doctrine/lexer v1.0.1
doctrine/orm v2.6.1
monolog/monolog 1.23.0
php-curl-class/php-curl-class 8.0.1
phpmailer/phpmailer v6.0.3
psr/cache 1.0.1
psr/log 1.0.2
psr/simple-cache 1.0.0
setasign/fpdf 1.8.1
symfony/cache v4.0.5
symfony/console v4.0.5
symfony/doctrine-bridge v4.0.5
symfony/event-dispatcher v4.0.5
symfony/filesystem v4.0.5
symfony/form v4.0.5
symfony/http-foundation v4.0.5
symfony/inflector v4.0.5
symfony/intl v4.0.5
symfony/options-resolver v4.0.5
symfony/polyfill-intl-icu v1.7.0
symfony/polyfill-mbstring v1.7.0
symfony/polyfill-php72 v1.7.0
symfony/process v4.0.5
symfony/property-access v4.0.5
symfony/security-core v4.0.5
symfony/security-csrf v4.0.5
symfony/translation v4.0.5
symfony/twig-bridge v4.0.5
symfony/validator v4.0.5
symfony/var-dumper v4.0.5
symfony/yaml v4.0.5
twig/extensions v1.5.1
twig/twig v2.4.6
表格类型:
public function buildForm( FormBuilderInterface $builder, array $options )
{
$builder
->add( 'name', TextType::class )
->add( 'image', TextType::class )
->add( 'typeId', IntegerType::class )
->add( 'customFields', EntityType::class, [
'class' => TypeDefinition::class,
'choice_label' => 'name',
'multiple' => true
] )
->add( 'isEnabled', CheckboxType::class )
->add( 'count', IntegerType::class );
}
如果您需要更多信息,请告诉我下面:)
5条答案
按热度按时间pxyaymoc1#
我终于找到了问题的答案:不能在SymfonyFramework上下文之外使用EntityType类。
原因是,
EntityType::class
需要多个组件才能由Symfony的FormBuilder解析。当然,您需要Doctrine和Symfony的doctrine-bridge。但要从EntityType::class
解析最终实体,DoctrineType:class
需要传递ManagerRegistry::class
。使用ManagerRegistry
,可以从Symfony应用程序解析Doctrine连接。因此,一种可能性是将实体管理器或已解析的实体与config一起传递给
FormType
,并创建一个ChoiceType::class
类型的字段。我希望这对你们中的一些人有帮助...
wnavrhmk2#
只要在services.yml中添加表单类即可。这个方法对我很有效
小心缩进tho,因为yml需要正确的缩进。
bgtovc5b3#
如果您不使用Symfony框架,请在services.yaml中启用
autoconfigure
和autowire
。示例:qoefvg9y4#
您的表单可能未在services.yml中正确注册?
当您实际使用Doctrine的MongoDBODM而不是EntityManager时,使用EntityType::class也会得到同样的错误
MongoDB的解决方案是使用DocumentType::class而不是EntityType::class
anauzrmj5#
我也有同样的问题。而且找到了解决办法。
确实可以在项目外部使用
EntityType
字段(例如在包中!)解决方案如下:
1.在包中创建一个
EntityType
字段类(e.g.单位为
src/Form/Builder/Type/EntityType.php
)在幕后,这个类将继承
DoctrineType
的教义,(直到今天)__construct()
需要RegistryManager
对象参数!2.在
EntityType
类中添加来自DoctrineType
的相同构造函数:3.手动将
ManagerRegistry
对象连接到包的services.yaml
中现在您可以在任何项目中实现和继承您的bundle中的
EntityType
。如果它不工作,您的bundle的
services.yaml
可能没有被正确加载!考虑一下symfony 6.2的最新更新,它为DependencyInjections提供了一个新的内部API,如果您的bundle主类继承自AbstractBundle
,那么您就不再需要单独的BundleExtension
类来发布您的yaml配置文件了。在bundle主类中添加以下内容: