Symfony 3-子窗体和元素名称

Symfony 3-子窗体和元素名称,symfony,Symfony,我想创建具有如下组成模式的表单: 我使用symfony3 它正在工作。我把每个元素都像一个对象一样,然后加上这个 但最后,我的表单元素名称的名称如下 form[subform][element] 如何在名称属性中创建没有子窗体的平面结构 use AppBundle\Base\Form\NickType; use AppBundle\Base\Form\MailType; use AppBundle\Base\Form\PassType; use AppBundle\Base\Form\Use

我想创建具有如下组成模式的表单:

我使用symfony3

它正在工作。我把每个元素都像一个对象一样,然后加上这个

但最后,我的表单元素名称的名称如下

form[subform][element]
如何在名称属性中创建没有子窗体的平面结构

use AppBundle\Base\Form\NickType;
use AppBundle\Base\Form\MailType;
use AppBundle\Base\Form\PassType;
use AppBundle\Base\Form\UserType;


class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', NickType::class)
            ->add('mail', MailType::class)
            ->add('password', PassType::class)
            ->add('repeat_password', PassType::class)
(etc...)
和单元素

class NickType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'inherit_data' => true
        ));
    }

}

如果一个
NickType
只继承一个TextType,则不需要定义它。您可以删除
NickType
MailType

您只需执行以下操作:

class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', TextType::class)
        ;
(etc...)
如果要重用表单字段,必须创建:

您可以从元素名称中删除
form[]
,但实际上不建议删除此项,因为在读取填充表单数据的请求时,您可以通过表单名称标识表单。()

您可以将根窗体的名称设置为空,然后设置字段名 只是形式而已。通过


()

如果一个
NickType
只继承了一个TextType,则不需要定义它。您可以删除
NickType
MailType

您只需执行以下操作:

class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', TextType::class)
        ;
(etc...)
如果要重用表单字段,必须创建:

您可以从元素名称中删除
form[]
,但实际上不建议删除此项,因为在读取填充表单数据的请求时,您可以通过表单名称标识表单。()

您可以将根窗体的名称设置为空,然后设置字段名 只是形式而已。通过


()

请显示您的表单类型。@StephanVierkant我更新了代码。谢谢您的回复。请显示您的表单类型。@StephanVierkant我更新了代码。谢谢你的回复。是的,但将来我会在很多形式中使用nick元素。这就是我希望每个字段有一个对象的原因。在一个地方,我将有验证规则等…好吧,它更好,但我得到:name=“register[nick]”最后我想得到name=“nick”。非常感谢。你真的想要这个有什么特别的原因吗?如果只是为了美观或代码:如果这样请离开。如果还有其他技术原因:请让我们知道,也许有更好的解决方案。如果您仍然需要:请参阅我的更新答案。在另一个项目中,我们有许多子窗体,以后我们应该使用多维数组来接收数据,但这并不好。所以我认为,这是主要原因。我每天都使用Zend框架,平面数组很适合做$row->setFromArray($data);以及以后的$row->save();所以这就是我想在Symfony这样做的原因:)这可能是习惯。谢谢你。@taro我的回答能解决你的问题吗?如果没有,请告诉我。否则,考虑投票和/或接受我的答案。我看你还没有投票。有关更多信息,请参阅。是的,但将来我将以多种形式使用nick元素。这就是我希望每个字段有一个对象的原因。在一个地方,我将有验证规则等…好吧,它更好,但我得到:name=“register[nick]”最后我想得到name=“nick”。非常感谢。你真的想要这个有什么特别的原因吗?如果只是为了美观或代码:如果这样请离开。如果还有其他技术原因:请让我们知道,也许有更好的解决方案。如果您仍然需要:请参阅我的更新答案。在另一个项目中,我们有许多子窗体,以后我们应该使用多维数组来接收数据,但这并不好。所以我认为,这是主要原因。我每天都使用Zend框架,平面数组很适合做$row->setFromArray($data);以及以后的$row->save();所以这就是我想在Symfony这样做的原因:)这可能是习惯。谢谢你。@taro我的回答能解决你的问题吗?如果没有,请告诉我。否则,考虑投票和/或接受我的答案。我看你还没有投票。有关更多信息,请参阅。
// the first argument to createNamedBuilder() is the name
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData)
    ->add('from', 'date', array(
        'required' => false,
        'widget' => 'single_text',
        'format' => 'dd.MM.yyyy'
    ));