【问题标题】:How does symfony know what is the type of this object got from form?symfony 怎么知道这个对象的类型是什么?
【发布时间】:2020-12-09 22:56:19
【问题描述】:

我正在使用 symfony 2.8 和学说(你会看到还在学习)。

我有这个控制器,我在其中创建一些表单并渲染它。 我不明白 symfony 怎么可能知道下面的 $contract 对象的类型。 然而,这些 $contract 对象最终会出现在我的数据库中的 contract 表中,所以一定有什么(魔术?)我不明白。

class MyContractsController extends BaseController
{
    public function addAction(Request $request)
    {
        $form = $this->createForm(MultiNewType::class)->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            foreach ($form->getData()['contracts'] as $contract) {
                $em->persist($contract);
            }
            $em->flush();
            return $this->validResponse();
        }
        return $this->renderModalFormResponse($form, array(
            'formTemplate' => 'MyBundle:Form:Contract/multiNew.html.twig'
        ));
    }

在 MultiNewType 文件下方,我没有看到任何与合同相关的内容。

class MultiNewType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('contracts', 'collection', array(
            'type' => new NewInlineType(),
            'allow_add' => true,
            'allow_delete' => true,
            'delete_empty' => true,
            'label' => false
        ));
    }

    public function getName()
    {
        return 'contractMultiNew';
    }
}

还有NewInlineType,我在其中看到了合同表的所有字段,但在合同的任何地方都看不到:

class NewInlineType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('foo', 'bar', array(
                'label' => false,
                'class' => 'MyBundle:MyClass',
            ))
            ->add('format', FormatType::class, array(
                'label' => false,
            ))
            ->add('version', VersionType::class, array(
                'label' => false,
            ))
            ->add('debut', 'datePicker', array(
                'label' => false,
                'placeholder' => 'Début'
            ))
            ->add('fin', 'datePicker', array(
                'label' => false,
                'placeholder' => 'Fin'
            ));
    }

    public function getName()
    {
        return 'contractNew';
    }

    public function getParent()
    {
        return 'contractEdit';
    }
}

谢谢

【问题讨论】:

  • 它应该是 MyBundle:MyClass 但你应该将它替换为你的实体 fcn,比如 `App\Entities\Contract`
  • 父表单类型(它的方法getName()返回'contractEdit')应该有一个public function configureOptions()来设置默认的data_class选项值,或者它有一个父表单。
  • 我不确定这是否可能,但也许 data_class 是在 src/AppBundle/Resources/config/services.yml 中配置的
  • 你确定实际的 NewInlineType 有 add('foo', 'bar', array( 吗?使用 bar 作为类型没有意义。我猜你的 data_class 是在 'bar' 中定义的类型。
  • @ArleighHix 我很确定你明白了,设置Contract 类的configureOptions()Contract/EditType.php 类中!!非常感谢 :) 你想发表一个回答以便我接受吗?

标签: forms symfony doctrine symfony-2.8


【解决方案1】:

您的NewInlineType 具有由getParent() 方法指示的父表单。
在这种情况下,父表单将从它的 getName() 方法返回 'contractEdit'
在父(或可能是祖父)表单中,您应该找到类似以下内容:

use AppBundle\Entity\Contract;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Contract::class,
    ));
}

这几乎就是它所说的;将默认的 data_class 选项设置为您的 Contract 类名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2015-01-08
    • 2013-06-02
    • 2019-06-14
    • 2020-02-08
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多