自定义类型实体隐藏而不总是传递类

时间:2014-10-23 23:23:12

标签: forms symfony

目前,我在某些表单中使用自定义类型,基本上成为了实体的#id;"和"实体到id"感谢bjo3rnf,但我不希望每次class传递,以及懒惰和其他问题。

我知道当我向FormBuilder添加一个字段并在类型symfony中传递null猜测正确的类型时,我认为它是使用主窗体的属性data_class我想做同样的猜测正确的课程,但我不知道如何访问父data_class

@jamek answer可以处理其他人失败的情况

示例:

use Doctrine\ORM\Mapping as ORM;

class Person {
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(length=150, type="string")
     */
    protected $name;

    /**
     * @var City
     * @ORM\ManyToOne(targetEntity="City")
     */
    protected $city;
}

class City {
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(length=150, type="string")
     */
    protected $name;
}
当我想创建新对象时,在控制器中

$object = new Person();
$form = $formFactory->create(new PersonType(), $object);

$form->submit($request); // here fails because cant convert city_id to City object

仅适用于存在的对象

$object = $manager->find('Person', $id);
$form = $formFactory->create(new PersonType(), $object);

$form->submit($request); // here works fine property is a object and the code get_class($builder->getData()) get the correct City class

2 个答案:

答案 0 :(得分:4)

如果我理解你想要你应该改变buildForm方法:

$transformer = new EntityToIdTransformer($this->objectManager, $options['class']);

 $transformer = new EntityToIdTransformer($this->objectManager, get_class($builder->getData()));

并从类

的Option解析器中删除所需的内容

答案 1 :(得分:1)

您可以在Person类

中添加构造



class Person {
    
    ...

    public function __construct()
    {
        $this->city = new City();
    }
}