Symfony3:绑定表单到实体类

时间:2017-09-19 20:20:02

标签: php forms symfony orm frameworks

我正在使用内置的Symfony3服务创建表单:
1)在AppBundle\Form中创建新课程,其中AbstractType扩展{。}} 2)在我的控制器中创建一个表单对象(使用createForm()
3)将该对象直接推送到树枝层(createView()

在我的实体方向上,我有两个类,已经由ORM映射到数据库。 第一个是User,第二个是UserAttributeUser与OneToMany注释的UserAttribute相关。关系看起来像:


class UserAttr
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="userAttr" )
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

来自User方:

class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\OneToMany(targetEntity="UserAttr", mappedBy="user")
     * @ORM\JoinColumn(nullable=false)
     */
    private $userAttr;

当我添加新字段时(使用$builder->add()),如果它们与User类属性相关联,则一切正常。但是如果我对UserAttribute属性做同样的事情 - symfony找不到该属性的get / set方法。我知道 - 我可以通过class User extends UserAttribute修复它,但可能不是重点。 Symfony必须有另一个解决方案,可能我错过了一些东西。

谢谢你的时间!

// SOLVED | there should be defined an EntityClassType as below:
$builder->add('credit',EntityType::class,array(
                'class' => UserAttr::class
            ));

1 个答案:

答案 0 :(得分:0)

您与One-To-Many实体的UserAttr关联User。因此,用户可能有多个信用。

选项1:

考虑到这一点,你必须在UserFormType中使用collection字段类型,这是一个有点冗长的过程。

$builder->add('userAttr', CollectionType::class, array(
    'label' => false,
    'allow_add' => true,
    'allow_delete' => true,
    'entry_type' => UserAttrType::class
));

然后创建另一个FormType:UserAttrType来代表UserAttr,您可以将credit字段作为UserAttr的属性。

$builder
    ->add('credit', TextType::class, array(
        'label' => 'Credit',
    ))

这样,表单将相应地加载和提交,当用户表单更新时,信用值也将更新。这是collection docs的链接。这是embed a collection form

的方法

选项2:

但是,如果您想进一步简化,请将mapped = falsedoc)添加到credit字段。这将忽略当前错误。但是,您必须手动从credit Object收集Form值,并将值设置为Submit Handler中的相应UserAttr对象。

希望它有所帮助!