Php 将用户名设置为sfDoctrineGuardPlugin中的电子邮件地址

Php 将用户名设置为sfDoctrineGuardPlugin中的电子邮件地址,php,symfony1,sfguard,Php,Symfony1,Sfguard,在表sf\u guard\u user中,需要电子邮件地址和用户名,但我想将电子邮件用作用户名 因此,我想从表单中删除其中一个字段,但由于需要,我总是会收到错误,我试图设置用户名=电子邮件地址,反之亦然,我尝试了操作、表单和模型,但没有成功 我认为在sfGuardUser模型中编写一个名为getUsername()的函数并返回电子邮件就足够了,但是没有 这可能吗?? 我该怎么做 谢谢,因为这是可能的。您甚至不必处理模式。只需将电子邮件存储在用户名和电子邮件地址中即可 class sfGuardU

在表
sf\u guard\u user
中,需要
电子邮件地址
用户名
,但我想将电子邮件用作
用户名

因此,我想从表单中删除其中一个字段,但由于需要,我总是会收到错误,我试图设置
用户名
=
电子邮件地址
,反之亦然,我尝试了操作、表单和模型,但没有成功

我认为在
sfGuardUser
模型中编写一个名为
getUsername()
的函数并返回电子邮件就足够了,但是没有

这可能吗?? 我该怎么做


谢谢,因为这是可能的。您甚至不必处理模式。只需将电子邮件存储在用户名和电子邮件地址中即可

class sfGuardUserForm extends PluginsfGuardUserForm
{
  public function doSave($con = null)
  {
    //update object with form values
    $this->updateObject();
    $this->getObject()->setUsername($this->getObject()->getEmailAddress());

    return parent::doSave($con);
  }
}

重写Object::save()函数中的username字段是一种更好的方法,这样它可以处理所有表单

在表单中,覆盖用户名小部件的验证程序。如果需要,还可以隐藏小部件

class sfGuardUserAdminForm extends BasesfGuardUserAdminForm
{

  public function setup()
  {
    parent::setup();
    $this->setWidget('username', new sfWidgetFormInputHidden());
    $this->setValidator('username', new sfValidatorPass());
  }

}


使用当前值更新表单对象。否则,您可能会得到引用过时数据的表单。
class sfGuardUser extends PluginsfGuardUser
{
  public function save(Doctrine_Connection $conn = null){
    $this->setUsername($this->getEmailAddress());
    parent::save($conn);
  }
}