有没有办法在FormBuilder中设置单个表单字段名称?
我的意思通常是你获得的是form_name[field_name]
,或者如果form_name是一个空字符串,你得到field_name
。
现在我想询问是否可以重命名单个字段名称,表单仍然有效。 像这样:
第一个字段name="form_name[field_name]"
第二个字段name="renamed_fildname"
第三栏name="form_name[field_name]"
等...
这可能吗?
更多解释:这就是我想要实现的目标:Default Symfony User Entity with Form Class
我发现默认登录需要名为_username
和_password
的输入字段,但表单不构建它。但有效的表格需要_token
字段。
现在,如果我尝试在表单中添加名称:
public function getName(){ return '_'; }
它会将所有名称都改成这种形式:_[field_names]
这对于令牌有好处但对我的用户名和密码字段不好。它需要_username
和_password
,但它实际上是_[username]
和_[password]
这对我不利,也不是安全捆绑,它只会让我发现坏证书。
答案 0 :(得分:4)
你让事情变得复杂。您的表单类对于登录表单没用。使用实体时,表单类是一个很好的实用程序,但您只需要提交两个字段并将它们传递给登录检查。因此,您不要更新或创建实体。但这是您实际需要表单类的地方。
阅读文档:http://symfony.com/doc/current/book/forms.html#creating-form-classes
你说你想学习这个,但你学得错了。正如他们在http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form给你的建议你应该使用一个简单的树枝模板作为无表格类的登录。
表单字段中的逻辑实际上是,该表单是对象,括号中的名称是属性所以:
product[description]
是一个表单字段,显示表单正在处理“product”实体,而“description”的特定字段要求您输入描述文本。
使用FOSUserBundle: https://github.com/FriendsOfSymfony/FOSUserBundle不要重新发明轮子;)
答案 1 :(得分:2)
正如@mvrhov所提到的,你应该将防火墙的默认参数与自定义表单类型相匹配,这里有greate article来证明这一点。
您可以通过更改防火墙来实现此目的:
security:
firewalls:
my_firewall:
pattern: ^/
form_login:
username_parameter: "form_name[username_field_name]"
password_parameter: "form_name[password_field_name]"
csrf_parameter: "form_name[_token]"
csrf_provider: form.csrf_provider
intention: authentication
此外,更改自定义表单的setDefaultOptions
以与此匹配(intention
与上述相同):
$resolver->setDefaults(array(
'intention' => 'authentication'
));
最后你的表格名称:
public function getName()
{
return 'form_name';
}
答案 2 :(得分:0)
另一件事是您可以使用表单名称轻松配置登录参数,例如
username_parameter: "account_login[username]"
password_parameter: "account_login[password]"
csrf_parameter: "account_login[_token]"