使用data_class在表单上进行自定义选择

时间:2016-09-27 08:39:16

标签: php forms symfony

我创建了一个FormType,它在data_class类的默认值中设置为configureOptions。看起来有点像这样

<?php
namespace tzfrs\AppBundle\Form\Type;

use tzfrs\AppBundle\Model\Car;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Class CarType
 * @package tzfrs\AppBundle\Form\Type
 */
class CarType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('specification', ChoiceType::class, [
            'choices' => [1 => 1, 2 => 2, 3 => 3]
        ]);
    }

    /**
     * @inheritdoc
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Car::class
        ]);
    }
}

当我现在创建这样的表格时

$carForm = $this->createForm(CarType::class, $car);

并想使用它我收到以下错误:

  

“object”类型的值无法转换为有效的数组键。

我认为原因是因为我的Car类有一个带有getter / setter的属性specification,因此返回一个Specification对象。但是,我的Specification对象有__toString()方法。

Car.php

/**
* @var Specification
*/
protected $specification;

public function getSpecification(): Specification
{
    return $this->specification;
}

public function setSpecification(Specification $specification): Car
{
    $this->specification = $specfification;
    return $this;
}

Specification.php

/**
 * Returns a string implementation of the current class
 *
 * @return string
 */
public function __toString(): string
{
    return sprintf(
        'HP: %s,CCM: %s',
        $this->getHorsePower(),
        $this->getCapacity()
    );
}

如何覆盖使用自定义模型的表单字段的选择?我不能使用EntityType,因为它不是一个学说模型。

当我像这样构建我的表单时

$carForm = $this->createForm(Car::class);

然后它可以工作,但是我需要Form中的Car对象,因为我在buildForm方法中添加了另一个字段

0 个答案:

没有答案