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]);
希望对您有所帮助
我有一个 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]);
希望对您有所帮助