php 症状/形式:函数DoctrineType::__construct()的参数太少

oxiaedzo  于 2022-12-21  发布在  PHP
关注(0)|答案(5)|浏览(102)

我遇到了一个奇怪的错误。我在自己的系统中实现了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 );
}

如果您需要更多信息,请告诉我下面:)

pxyaymoc

pxyaymoc1#

我终于找到了问题的答案:不能在SymfonyFramework上下文之外使用EntityType类。
原因是,EntityType::class需要多个组件才能由Symfony的FormBuilder解析。当然,您需要Doctrine和Symfony的doctrine-bridge。但要从EntityType::class解析最终实体,DoctrineType:class需要传递ManagerRegistry::class。使用ManagerRegistry,可以从Symfony应用程序解析Doctrine连接。
因此,一种可能性是将实体管理器或已解析的实体与config一起传递给FormType,并创建一个ChoiceType::class类型的字段。
我希望这对你们中的一些人有帮助...

wnavrhmk

wnavrhmk2#

只要在services.yml中添加表单类即可。这个方法对我很有效

[bundle_name].form.[class_name]:
   class: [bundle_name]\Form\Type\[class_name]
   arguments: ["@doctrine.orm.entity_manager"]
   tags:
     - { name: form.type }

小心缩进tho,因为yml需要正确的缩进。

bgtovc5b

bgtovc5b3#

如果您不使用Symfony框架,请在services.yaml中启用autoconfigureautowire。示例:

App\Form\:
    resource: '../src/Form'
    autowire: true
    autoconfigure: true
qoefvg9y

qoefvg9y4#

您的表单可能未在services.yml中正确注册?

services:
    Namespace\Type\YourType:
        autowire: true
        tags:
            - { name: form.type }

当您实际使用Doctrine的MongoDBODM而不是EntityManager时,使用EntityType::class也会得到同样的错误

MongoDB的解决方案是使用DocumentType::class而不是EntityType::class

anauzrmj

anauzrmj5#

我也有同样的问题。而且找到了解决办法

确实可以在项目外部使用EntityType字段(例如在包中!)

解决方案如下:

1.在包中创建一个EntityType字段类

(e.g.单位为src/Form/Builder/Type/EntityType.php
在幕后,这个类将继承DoctrineType的教义,(直到今天)__construct()需要RegistryManager对象参数!

  • 这就是你的问题所在-集成包不会自动连接继承的构造函数参数,所以你必须手动连接。*
2.在EntityType类中添加来自DoctrineType的相同构造函数:
namespace MyCorp\FormsBundle\Form\Type;

use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class EntityType extends EntityType
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry);
    }
}
3.手动将ManagerRegistry对象连接到包的services.yaml
services:
    MyCorp\FormsBundle\Form\Type\FormEntityType:
        arguments:
            $registry: '@doctrine'

现在您可以在任何项目中实现和继承您的bundle中的EntityType
如果它不工作,您的bundle的services.yaml可能没有被正确加载!考虑一下symfony 6.2的最新更新,它为DependencyInjections提供了一个新的内部API,如果您的bundle主类继承自AbstractBundle,那么您就不再需要单独的BundleExtension类来发布您的yaml配置文件了。
在bundle主类中添加以下内容:

namespace MyCorp\FormsBundle;

class MyCorpFormsBundle extends AbstractBundle
{
    public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
    {
        $container->import('../config/services.yaml');
    }
}

相关问题