在User.class.php中我有:
$this->setCode(sha1($this->getPassword()));
这没关系。在注册表中,我想使用sfValidatorDoctrineUnique。
$this->validatorSchema->setPostValidator(new sfValidatorDoctrineUnique(array('model'=>'User', 'column'=>'code')));
但这行不通。此检查来自不带sha1的表单和带有sha1的数据库的密码。我使用sfValidatorDoctrineUnique也用于电子邮件(没有sha1(,这还可以。我该怎么修?我使用Symfony 1.4.12
为什么要检查密码是否唯一?这完全没有意义
UPD:要创建自己的验证器,请创建/lib/valdator/sfValidatorDoctrineFoobar.class.php
<?php
class sfValidatorDoctrineFoobar extends sfValidatorBase
{
protected function configure($options = array(), $messages = array())
{
$this->addMessage('invalid_record', 'Unable to find the related record');
}
protected function doClean($value){
$status = $this->getCodeStatus($value);
if ($status == 1){
throw new sfValidatorError($this, 'Code is invalid', array('value' => 'invalid code'));
}
if ($status == 2){
throw new sfValidatorError($this, 'Code allready used', array('value' => 'used'));
}
return $value;
}
protected function getCodeStatus($value){
$q = Doctrine_Query::create()->from('Code c');
$q->select('c.hash, c.used');
$q->addWhere('c.hash = ?', $value);
$result = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
if (!$result) return 1;
if ($result['used'] == 1) return 2;
return false;
}
}
只是给你举个例子。。您必须根据需要更改代码;(
Symfony有一个内置选项,可以对您的密码进行哈希处理,我认为您应该使用它。你可以在这里阅读:sfGuardPlugin。如果我是你,我会使用sfDoctrineGuardPlugin和sfForkedDoctrineApplyPlugin。我一直在使用它,它解决了所有这些问题。