Symfony 表单注入对象

Symfony Forms Inject object

我有一个 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);

上面的代码抛出构造函数 none 错误,因为它实例化了没有传递给产品注入器的类型。

这个也抛出异常:

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

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

您可以使用选项传递额外的数据

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]);

希望对您有所帮助