Symfony/Form: 函数 DoctrineType::__construct() 的参数太少
Symfony/Form: Too few arguments to function DoctrineType::__construct()
我遇到了一个奇怪的错误。我在自己的系统中实现了 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
这里有人知道为什么会这样吗?
附加信息:
作曲家包版本:
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 );
}
如果您需要更多信息,请在下面告诉我:)
如果您不使用 Symfony 框架,请在您的 services.yaml 中启用 autoconfigure
和 autowire
。示例:
App\Form\:
resource: '../src/Form'
autowire: true
autoconfigure: true
我终于找到了问题的答案:
在 SymfonyFramework 上下文之外使用 EntityType class 是不可能的。
原因是,EntityType::class
需要多个组件才能由 Symfony 的 FormBuilder 解析。当然你需要 Doctrine 和 Symfony 的 doctrine-bridge。但是为了从 EntityType::class
解析最终实体,DoctrineType:class
需要传递 ManagerRegistry::class
。使用 ManagerRegistry
可以从 Symfony 应用程序解析 Doctrine 连接。
所以一种可能性是将实体管理器或已解析的实体与配置传递给 FormType
并创建一个 ChoiceType::class
类型的字段。
我希望这对你们中的一些人有所帮助...
只需在 services.yml 中添加您的表单 class。这个方法对我有用
[bundle_name].form.[class_name]:
class: [bundle_name]\Form\Type\[class_name]
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
注意缩进,因为 yml 需要适当的缩进。
您的表单可能没有在 services.yml?
中正确注册
services:
Namespace\Type\YourType:
autowire: true
tags:
- { name: form.type }
当您实际使用 Doctrine 的 MongoDB ODM 而不是他们的 EntityManager
时,您也可以在使用 EntityType::class 时遇到完全相同的错误
MongoDB 的解决方案是使用 DocumentType::class 而不是 EntityType::class
我遇到了一个奇怪的错误。我在自己的系统中实现了 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
这里有人知道为什么会这样吗?
附加信息:
作曲家包版本:
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 );
}
如果您需要更多信息,请在下面告诉我:)
如果您不使用 Symfony 框架,请在您的 services.yaml 中启用 autoconfigure
和 autowire
。示例:
App\Form\:
resource: '../src/Form'
autowire: true
autoconfigure: true
我终于找到了问题的答案: 在 SymfonyFramework 上下文之外使用 EntityType class 是不可能的。
原因是,EntityType::class
需要多个组件才能由 Symfony 的 FormBuilder 解析。当然你需要 Doctrine 和 Symfony 的 doctrine-bridge。但是为了从 EntityType::class
解析最终实体,DoctrineType:class
需要传递 ManagerRegistry::class
。使用 ManagerRegistry
可以从 Symfony 应用程序解析 Doctrine 连接。
所以一种可能性是将实体管理器或已解析的实体与配置传递给 FormType
并创建一个 ChoiceType::class
类型的字段。
我希望这对你们中的一些人有所帮助...
只需在 services.yml 中添加您的表单 class。这个方法对我有用
[bundle_name].form.[class_name]:
class: [bundle_name]\Form\Type\[class_name]
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
注意缩进,因为 yml 需要适当的缩进。
您的表单可能没有在 services.yml?
中正确注册services:
Namespace\Type\YourType:
autowire: true
tags:
- { name: form.type }
当您实际使用 Doctrine 的 MongoDB ODM 而不是他们的 EntityManager
时,您也可以在使用 EntityType::class 时遇到完全相同的错误MongoDB 的解决方案是使用 DocumentType::class 而不是 EntityType::class