当前位置: 首页 > 知识库问答 >
问题:

原则嵌入不使用Symfony表单

贺高飞
2023-03-14

有没有人在使用doctrine Embeddebles和symfony表单时遇到过这个问题?

如果你不知道可嵌入原则是什么,你可以在这里阅读http://doctrine-orm.readthedocs.org/en/latest/tutorials/embeddables.html

在表单提交时(在持久化到DB的过程中)将value对象(在我的情况下是CategoryType)与symfony表单一起使用时,我得到以下警告

警告:ReflectionProperty::getValue()要求参数1为object,字符串为给定的

这是因为symfony表单返回字符串而不是可嵌入对象。

我现在唯一的解决方法是使用映射=

我的实体、价值对象和形式(为了提问而简化)

Foo\BarBundle\Entity\CategoryType

<?php

namespace Foo\BarBundle\Entity;

class CategoryType
{
    /**
     * @var string
     */
    protected $value;

    public function __toString()
    {
        return (string) $this->getValue();
    }

    /**
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * @param string $value
     *
     * @return $this
     */
    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }
}

Foo\BarBundle\资源\配置\原则\类别Type.orm.yml

CategoryType.orm.yml
    Foo\BarBundle\Entity\CategoryType:
        type: embeddable
        fields:
            value:
                type: string

Foo\BarBundle\Entity\Category

<?php

namespace Foo\BarBundle\Entity;

class Category
{
    /**
     * @var integer
     */
    protected $id;
    /**
     * @var string
     */
    protected $name;
    /**
     * @var CategoryType
     */
    protected $type;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return \Foo\BarBundle\Entity\CategoryType
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * @param \Foo\BarBundle\Entity\CategoryType $type
     *
     * @return $this
     */
    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return (string) $this->getName();
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     *
     * @return $this
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }
}

Foo\BarBundle\Resources\config\doctrine\Category。orm。yml公司

Foo\BarBundle\Entity\Category:
    type: entity
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
        name:
            type: string
    embedded:
        type:
            class: CategoryType

Foo\BarBundle\Form\类别类型

<?php

namespace Foo\BarBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CategoryType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('type')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => 'Foo\BarBundle\Entity\Category'
            )
        );
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'category_form';
    }
}

共有1个答案

史骏
2023-03-14

原则嵌入行为只是一种持久机制,因此,它不能破坏独立于它的表单组件(并且适用于所有对象图)。

问题是表单设计得不好(它没有遵循对象图)。在这里,您有一个包装类别类型的类别。因此,表单必须在定义级别遵循相同的结构。

您必须创建一个类别类型表单(映射到您的类别类型),在该表单中添加一个值字段。然后,在您的类别类型(表单一)中,必须为类型字段嵌入类别类型。

然后,表单组件将自动创建一个类别,它包装了一个类别类型。然后,Doctrine将简单地将您的对象持久化为可嵌入的,一切都会正常工作:)

 类似资料:
  • 我有一个mongodb文档,我已经把它变成了一个表单。该文档有两个emebedOne文档,它们也是表单。正在验证主文档,但未验证嵌入文档。我正在使用自定义断言,但我认为这不重要。 文档 嵌入式类对此的自定义断言永远不会调用。 形式 处理程序 谢谢你的帮助。 科里

  • 我有一个数据结构,其中一个主题有许多问题(一对多),一个问题有许多答案(一对多)。 我已经在主题表单中设置了问题作为嵌入式集合,由于有了烹饪书条目,我可以百分之百地解决所有问题。 当我试图开发它以在问题表单中嵌入一组答案表单时,我遇到了一个问题。 包含顶层原型表单的数据原型属性具有表单的全部深度,因此包括问题和答案的原型。但它对每个级别使用相同的占位符。 你可以在底部看到一条很长的线,我想这就是原

  • 在工作中,我在Symfony 3.4/Doctrine/mySQL中有一个(旧的)项目,其中我使用了一组嵌入式表单。A类包含对象B(ManyToOne)的arrayCollection(原则一域一域)。 在创建或编辑时,对象A的输入形式允许使用“添加”按钮创建/修改/删除对象B的嵌入形式。它按预期工作。 原则级联(持久化/删除和孤儿删除)允许自动持久化对象A上的所有修改(包括新的/修改/删除嵌入的

  • 我有一个mysql查询,它并不是很复杂,但我似乎不知道应该如何用Symfony编写它。 首先是查询: 我基本上是想看看t1是否是这些列中任何单词的一部分。假设是正在传递的变量。我不确定我是否应该在存储库中写这篇文章,如果应该,如何写。我正在寻找最佳实践方法。 谢谢

  • 下面将列出六个在采用DevOps时必不可少的原则: 以客户为中心的行动:DevOps团队必须采取以客户为中心的行动,因为他们应该不断投资于产品和服务。 端到端的责任:DevOps团队需要提供性能支持,直到它们终止为止。这提高了产品的责任水平和质量。 持续改进:DevOps文化专注于持续改进,以尽量减少浪费。它不断加快提供的产品或服务的改进。 自动化一切:自动化是DevOps流程的重要原则。这不仅适

  • 我更新了实体文件以包含关系映射。