我们正在使用自定义电子邮件验证程序,我们在验证与同一对象有关系的两个不同对象时遇到问题。
以下是示例代码:
$ti = EnumTipoInteresadoQuery::create()->findOne();
$i1 = new Interesado();
$i1->setTipoInteresado($ti);
$i1->setMail('testexample.com');
var_dump($i1->validate()); // Must be false and we get false. OK!
$i2 = new Interesado();
$i2->setTipoInteresado($ti);
$i2->setMail('hello@example.com');
var_dump($i2->validate()); // Must be true but we get false. BAD!
当我们验证第一个($ i1)时,一切正常。当我们验证第二个($ i2)时,如果我们应该得到真的那么我们会得到假的!
在自定义验证器中,我们回显了一条消息,其中包含了经过验证的字符串:
class EmailValidator implements BasicValidator
{
public function isValid(ValidatorMap $map, $str)
{
echo "Validating $str\n";
return preg_match('/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i', $str) !== 0;
}
}
查看输出,我们看到以下内容:
Validating testexample.com
bool(false)
Validating testexample.com
Validating hello@example.com
bool(false)
我们可以清楚地看到第二次验证($ i2)两次调用自定义验证器,首先是第一个对象($ i1)的邮件,然后是第二个邮件($ i2)。
我们怀疑,因为这两个对象引用了一个公共对象($ ti),所以验证以某种方式“级联”并验证第一个($ i1)和第二个($ i2)对象。
此问题是否有解决方法?这是一个错误吗?这是我们做错了吗?
提前致谢!
安德烈斯