【问题标题】:Symfony Form Framework - Best way to implement change password functionality?Symfony Form Framework - 实现更改密码功能的最佳方式?
【发布时间】:2010-01-29 21:11:28
【问题描述】:

我正在尝试了解 Symfony 1.4 中的表单框架。我已经阅读了“More with symfony”一书中令人难以置信的detailed section,但我仍然不确定如何实现一个简单的“更改密码”功能。

要求非常基本,

  1. 将有两个字段,new_passwordconfirm_new_password。两者都是输入字段。
  2. new_password 字段将被验证为包含字母和数字的 6 到 30 个字符之间的字符串。
  3. confirm_new_password 字段将被验证以与 new_password 字段完全匹配。

现在,目前我通过以下方式实现了这个,

  • 向我的表单添加 2 个新字段。
  • 将字符串验证器添加到new_password 字段以检查字符串长度。
  • 将字符串验证器添加到 confirm_new_password 字段以确保已填写。
  • 然后验证新密码是否有效并与自定义后验证器中的确认密码匹配。我这样做是因为我不想在 new_password 字段有效之前验证 confirm_new_password 字段。

现在进入我的问题。在阅读了上面提到的文章后,我开始认为我应该将这两个字段包含在一个小部件或一个子表单中,因为它们彼此严重依赖,没有另一个是无用的。

我想知道人们对此有何想法,如果有人实施了,他们是如何做到的?

谢谢

注意:没有current_password 字段,因为这是我的管理区域。

【问题讨论】:

    标签: php forms frameworks symfony1


    【解决方案1】:

    您可以使用sfDoctrineGuardPlugin

    这个插件为您的网站用户管理提供了方便的表单、模型和控制器。

    你可以扩展这个插件,定制你的需要,这是一个非常常用的插件(最常用的)。

    【讨论】:

    • 我认为 sfGuard 不包含“更改密码”功能。编辑:我的立场是正确的,看起来确实如此。
    【解决方案2】:

    我为 symfony 1.2 创建了某种密码验证器(我还没有为 1.4 测试过)。你可以看看here

    基本特点是:

    • 根据一个或多个正则表达式验证密码。
    • 比较两个字段中的值是否相同。
    • 如果已设置密码,则不必填写密码字段以进行验证(如果密码更改字段集成在配置文件表单中,如果不想更改字段可以为空,则很方便密码)。

    要使用它,您必须设置两个输入字段并将验证器添加为这两个字段的后验证器。

    这不是你想要的,但也许它会给你一个开始。

    【讨论】:

      【解决方案3】:

      我还没有听说已经为您处理这个问题的任何东西。

      自定义小部件和验证器

      您可以创建一个自定义小部件来封装两个表单字段,只要您可以通过仅与您的字段关联的一个标签来实现这一点。如果你想为此创建一个自定义验证器,它必须是一个后验证器(参见 sfValidatorSchemaCompare 示例),因为字段验证器只接收一个要验证的值。通过这种方法,您最终会获得:

      • 在表单中少定义一个小部件
      • 将后验证器功能移至单独的类中

      并失去:

      • 确认密码字段的标签

      嵌入式表单

      因为密码/确认字段不是父元素的子部分,因此嵌入表单对我来说似乎是错误的。

      继承

      另一种可能对您有用的方法是创建一个sfPasswordEditForm 类,您的表单可以扩展该类来定义您的两个密码字段和发布验证器。然后,您可以使用 widgetSchema 之外的 moveField 方法将字段按照您希望的顺序放置在自定义表单中:

      $this->widgetSchema->moveField('password', 'after', 'username');
      $this->widgetSchema->moveField('password_again', 'after', 'password');
      

      【讨论】:

      • 我认为合并比继承更好。
      【解决方案4】:

      一些人建议查看sfGuardPlugin。这样做之后,我注意到它几乎完全按照我目前的实现方式实现了更改密码功能。

      感谢您的回答!

      【讨论】:

        猜你喜欢
        • 2012-10-25
        • 1970-01-01
        • 2010-10-06
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 2010-11-18
        • 1970-01-01
        相关资源
        最近更新 更多