Symfony表单注入对象

时间:2016-06-17 14:38:34

标签: php symfony symfony-forms

我有一个Symfony表单类型,我想注入另一个我创建的表单:

$form = $this->createFormBuilder();
$form->add('quantity', NumberType::class);
$form->add('options', ProductOptionType::class);
$form->add('notes', TextareaType::class, ]);

ProductOptionType是我创建的另一种类型但是在这种类型上我向构造函数注入了当前产品,因此我知道该产品有哪些可用选项以便在表单中添加(即颜色,大小等)。

class ProductOptionType extends AbstractType
{    
    private $productOptions;

    public function __construct(Product $product)
    {
        $this->productOptions = $product->getOptions();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($this->productOptions as $option) {
            $builder->add($option->getId(), ChoiceType::class, [
                'choices' => $option->getChoicesForForm(),
                'label' => $option->getName()
            ]);
        }
    }
}

问题是如何在这里传递构造函数???

$form->add('options', ProductOptionType::class);

上面会抛出contstructor none错误,因为它实例化了没有传递给产品注入器的类型。

此外还抛出异常:

$form->add('options', new ProductOptionType($product));

因为它需要一个字符串而不是一个对象。

1 个答案:

答案 0 :(得分:3)

您可以使用选项

传递额外数据
class ProductOptionType extends AbstractType
{    

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $productOptions = $options['productOptions'];

        foreach ($productOptions as $option) {
            $builder->add($option->getId(), ChoiceType::class, [
                'choices' => $option->getChoicesForForm(),
                'label' => $option->getName()
            ]);
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        // you can define a required option field for work
        $resolver->setRequired([
             'productOptions',
         ]);
         // ...
         // You could specify which type of class is supported
        $resolver->setAllowedTypes([
             'productOptions' => ProductOptions:class,
         ]);
    }

}

然后在表单创建中使用它,如下所示:

$form->add('options', ProductOptionType::class, ['productOptions' => $product]);

希望这个帮助