在工作中,我们正在测试几种不同的PHP框架。为了对它们进行性能测试,我们在每个实现相同的功能。
我们有一个REST规范,用于定义所使用的路由和数据元素。例如,对于POST / sprints / create路由,我需要在post数据中包含几个字段,如csrf,sprint_label,sprint_points。
我创建了一个带有Label和Points的实体,以及一个用于创建表单的FormType,但我找不到任何方法来更改HTML表单中生成的名称属性,最终定义POST数据名称。
我尝试在树枝模板中添加{attr:{'name':'sprint_label'}},但显然它被忽略了(我想象的保留字)。我看过Data Transformers,但在我看来,实体属性名称与生成的表单字段名称紧密耦合。
我考虑过编写一个表单实体包装器来重新映射名称,但是我不明白在post之后的表单生成和实体管理器之间发生的魔术(使用哪些方法调用哪些参数)。 。
有没有人知道如何自定义生成的表单字段名称?
谢谢, 萨姆
表格代码:
<?php
namespace Blah\AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class SprintType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text')
->add('points', 'integer')
->add('Save', 'submit');
}
public function getName()
{
return ''; // this removes the sprint[title] name, leaving just title.
}
}
答案 0 :(得分:1)
您可以半手动执行read more
,而不是渲染整个form
示例:
您的代码可能如下:
{{ form(form) }}
我认为您正在寻找:
{{ form_start(form) }}
{# ... #}
{{ form_widget(form.label, {'attr': {'class': 'sprint_label_or_something'}}) }}
您也可以使用HTML标记手动完全呈现它:
<form action="{{ route('your_route') }}">
<input name="some_type[label]" />
</form>
答案 1 :(得分:1)
我不认为您可以直接自定义字段的呈现名称。但是,您只需将所需名称添加到构建器即可。请记住,如果实体没有相应的属性,则必须更正属性路径。尝试像
这样的东西public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('sprint_label', 'text', array('property_path' => 'title'))
->add('sprint_points', 'integer', array('property_path' => 'points'))
->add('Save', 'submit');
}
正如您已经发现的那样,在getName()
中返回一个空字符串会从字段名称中删除表单的名称。但似乎这不是正确的解决方案。查看https://stackoverflow.com/a/19379696/733368
相反,您应该使用表单工厂并创建命名表单。像
这样的东西$form = $this->container->get("form.factory")->createNamed(null, new YourFormType(), $entity);
应该有用。
有关表单类型的更多详细信息,请查看Symfony Form Types Reference