【问题标题】:Symfony Form Class: rename fields name attribute's valueSymfony Form Class:重命名字段名称属性的值
【发布时间】:2014-07-09 16:26:25
【问题描述】:

有没有办法在 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] 这对我不利,对安全捆绑包也不好,它只会给我抛出错误的凭据。

【问题讨论】:

    标签: php symfony symfony-2.1


    【解决方案1】:

    你让事情变得复杂。您的表单类对登录表单毫无用处。当您使用实体时,表单类是一个很好的实用程序,但您只需要提交两个字段并将它们传递给登录检查。因此,您无需更新或创建实体。但这是你真正需要一个表单类的地方。

    阅读文档: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]
    

    是一个表单字段,显示表单正在处理“产品”实体,而“描述”的特定字段希望您输入描述文本。


    使用 FOSUserBundle: https://github.com/FriendsOfSymfony/FOSUserBundle 不要重新发明轮子 ;)

    【讨论】:

    • 是的,我知道我让一些事情变得复杂,但这是我知道如何学习新东西以及限制是什么的唯一方法。并感谢您明确回答我想做的事情是不可能的。
    • 我同意这是此用例的正确答案,但有些情况下您需要能够在 symfony 中执行此操作。在这种情况下,您可以只使用 {{ form_row(form.name, {'full_name':'name'}) }} 但不要期望之后将请求绑定到表单。在使用 angularJs 来管理数据模型时,我在某些情况下会使用它。
    【解决方案2】:

    正如@mvrhov 提到的,您应该使用防火墙的默认参数来匹配您的自定义表单类型,这里有一个很好的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';
    }
    

    【讨论】:

      【解决方案3】:

      另一件事是您可以使用表单名称轻松配置登录参数,例如

      username_parameter: "account_login[username]"
      password_parameter: "account_login[password]"
      csrf_parameter: "account_login[_token]"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多