Forms Symfony2表单组件-创建名称属性中没有表单名称的字段

Forms Symfony2表单组件-创建名称属性中没有表单名称的字段,forms,symfony,silex,Forms,Symfony,Silex,我目前正试图通过Silex微框架使用Symfony2表单组件 我的登录表单生成如下: $app = $this->app; $constraint = new Assert\Collection(array( 'username' => new Assert\NotBlank(), 'password' => new Assert\NotBlank(), )); $builder = $app['form.factory']->createBuilde

我目前正试图通过Silex微框架使用Symfony2表单组件

我的登录表单生成如下:

$app = $this->app;

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(),
    'password' => new Assert\NotBlank(),
));

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint));

$form = $builder
    ->add('username', 'text', array('label' => 'Username'))
    ->add('password', 'password', array('label' => 'Password'))
    ->getForm()
;

return $form;
<fieldset>
    <input type="hidden" value="******" name="form[_token]" id="form__token">
    <section class="">
        <label class=" required" for="form_username">Username</label>
        <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div>
    </section>
    <section class="">
        <label class=" required" for="form_password">Password</label>
        <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div>
    </section>
    <section>
        <div><button class="fr submit">Login</button></div>
    </section>
</fieldset>
<div><input type="text" value="" name="username" id="username" class="text"></div>
...
<div><input type="password" value="" name="password" id="password" class="password"></div>
问题是生成的表单的创建方式如下:

$app = $this->app;

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(),
    'password' => new Assert\NotBlank(),
));

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint));

$form = $builder
    ->add('username', 'text', array('label' => 'Username'))
    ->add('password', 'password', array('label' => 'Password'))
    ->getForm()
;

return $form;
<fieldset>
    <input type="hidden" value="******" name="form[_token]" id="form__token">
    <section class="">
        <label class=" required" for="form_username">Username</label>
        <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div>
    </section>
    <section class="">
        <label class=" required" for="form_password">Password</label>
        <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div>
    </section>
    <section>
        <div><button class="fr submit">Login</button></div>
    </section>
</fieldset>
<div><input type="text" value="" name="username" id="username" class="text"></div>
...
<div><input type="password" value="" name="password" id="password" class="password"></div>
不幸的是,FormFactory使用FormBuilder,然后FormBuilder与Form类一起工作,我没有足够的时间来分析组件的整个内部工作

我知道字段会添加到FormBuilder中的“children”数组中,并带有相应的选项列表。调用getForm函数时,将实例化一个新表单,并使用add()方法将每个子字段类型输入表单。此Form->add()方法自动将表单设置为每个子级的父级:

public function add(FormInterface $child)
{
    $this->children[$child->getName()] = $child;

    $child->setParent($this);

    if ($this->dataMapper) {
        $this->dataMapper->mapDataToForm($this->getClientData(), $child);
    }

    return $this;
}
如果不只是为了删除这些类而覆盖这些类,其他人知道只显示字段名的最佳方法吗


可以在form_div_layout.html.twig widget_attributes块中直接拉取'name'而不是'full_name',但我不确定这是否理想(因为id保持不变),或者是否有其他方法或可注入选项可以实现这一点。

使用createBuilder函数代替:

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint));
第一个参数是表单名称


Bernhard Schussek自己在

上的示例如果您不使用子表单,则可以将表单的
getName
方法设置为空字符串:

class FormType extend AbstractType {
    // ...

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

在Symfony3中,重写子类中的AbstractType::getBlockPrefix以返回null。

Ahhh,现在我为什么不看看github,这是有道理的。谢谢:)啊哈!您已经更新了您的答案-一个理想的解决方案!谢谢当使用FormTypes作为服务时,可以这样做吗?我认为您无法在该上下文中访问createNamedBuilder,并且使用FormType::getName(){return“”;}会导致将FormType作为服务引用时出现问题。@caponica确实如此。你找到办法了吗?@mmoreram-是的,Bernhard(在另一个线程中)指出,这很简单:你只需使用$builder->getFormFactory()(我已经有一段时间没有看这个了,所以不要马上记住细节!)