【问题标题】:Symfony3 Could not load type error during form generationSymfony3在表单生成期间无法加载类型错误
【发布时间】:2016-10-18 13:27:31
【问题描述】:

我正在尝试在 Symfony 3 中构建一个表单,但遇到了一些我认为应该很容易解决的问题,但我想我没有找到正确的地方。

我有 2 个对象,实体和供应商。 1 个实体确实有 1 个与之关联的供应商。 1 个供应商可以有许多与之相关的实体。 (一对多关联)。

我正在尝试为 Entity 类构建表单,并使用一个下拉列表提供它必须与之关联的供应商。

这里是实体表单类:

<?php

namespace VP\SupplierBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use VP\SupplierBundle\Entity\Supplier;
use VP\SupplierBundle\Repository\SupplierRepository;

class EntityType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('name')
                ->add('supplier', Supplier::class, array(
                    'class' => 'VPSupplierBundle:Supplier',
                    'property' => 'name',
                    'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
                        return $er->findAllByIsDeleted(0);
                    },
                    'choice_label' => 'name'
                ))
                ->add('submitnew', SubmitType::class, array(
                    'label' => 'Add Entity',
                    'attr' => array(
                        'class' => 'btn btn-primary',
        )));
    }

这是我应该调用的 SupplierRepository:

<?php

namespace VP\SupplierBundle\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * SupplierRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class SupplierRepository extends EntityRepository {

    public function findAllByIsDeleted($isDeleted) {
        $qb = $this->createQueryBuilder('s');
        $qb
                ->where('s.isDeleted = :isDeleted')
                ->setParameter('isDeleted', $isDeleted);
        return $qb;
    }

}

我仍然收到以下错误:

无法加载类型“VP\SupplierBundle\Entity\Supplier”

知道它可能来自哪里吗?尝试查看official symfony doc 和一些论坛主题,但到目前为止没有运气...

非常感谢您的帮助!

@Jeet 提供的工作解决方案

//  
use Symfony\Bridge\Doctrine\Form\Type\EntityType as DoctrineEntityType;
//

public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('name')
                ->add('supplier', DoctrineEntityType::class, array(
                    'class' => 'VPSupplierBundle:Supplier',
                    'query_builder' => function (EntityRepository $er) {
                        return $er->findAllByIsDeleted(0);
                    },
                    'choice_label' => 'name'
                ))
                ->add('submitnew', SubmitType::class, array(
                    'label' => 'Add Entity',
                    'attr' => array(
                        'class' => 'btn btn-primary',
        )));
    }

谢谢!

【问题讨论】:

  • 您的 __toString() 是否已定义在您的 Supplier 类中?
  • 刚刚在 Supplier 类中创建它,但没有变化:public function __toString() { return $this-&gt;getName(); }

标签: php forms symfony


【解决方案1】:

你在这里做错了:

->add('supplier', Supplier::class, array(
    'class' => 'VPSupplierBundle:Supplier',
    'property' => 'name',
    'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
        return $er->findAllByIsDeleted(0);
    },
    'choice_label' => 'name'
))

您正在加载表单类型未知的Supplier::class。我想您应该改为加载 EntityType::class 表单类型。

在此处查看document。您想显示与实体关联的选择字段,因此您需要有EntityType::class。要识别实体类型,您已经通过class 选项提供您的实体身份。所以说清楚了。

希望对你有帮助!

【讨论】:

  • 感谢 Jeet 的反馈。不确定为什么要在这里调用 EntityType 类,因为我正在尝试在此处集成供应商的下拉列表。
  • @Vincent 您需要区分表单类型和实体。您确实需要将此字段定义为 EntityType。在这里查看 Symfony 中可用的默认表单类型:symfony.com/doc/current/reference/forms/types.html
  • 非常感谢您的回复,它确实有效,我的理解完全错误!我将在初始主题中记录解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多