Symfony Form Class:重命名字段name属性的值

时间:2013-02-08 13:21:07

标签: php symfony symfony-2.1

有没有办法在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]这对我不利,也不是安全捆绑,它只会让我发现坏证书。

3 个答案:

答案 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]"