我正在尝试通过特殊验证事件验证数据完整性。我的Phalcon \ Mvc \ Collection模型使用一些Phalcon \ Mvc \ Model \ Validator验证器实现validation()方法。在我的控制器中,我保存()该模型。如果保存操作失败,我尝试通过模型的getMessages()方法输出错误消息。换句话说,我按照文档http://docs.phalconphp.com/en/latest/reference/odm.html
中提供的示例进行操作但是,我收到一个错误,即getMessages()方法不存在。我的Phalcon版本是0.7.0。我检查了API http://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Collection.html,但它没有显示getMessages()方法。我还对Phalcon \ Mvc \ Collection类进行了反射测试,并确认了该观察结果。
该文档还指出我们可以使用Phalcon \ Mvc \ Collection \ Validator实现我们自己的验证器。但是,似乎这个类不存在。
所以,我的问题是:
感谢您的时间。
答案 0 :(得分:8)
你是对的,实现中缺少getMessages()方法。现在,您可以将它添加到模型中,同时将其正式添加到C类中:
<?php
class Users extends Phalcon\Mvc\Collection
{
public function getMessages()
{
return $this->_errorMessages;
}
}
1-如何显示验证结果的错误消息?检查上面
2-如何创建自定义验证器?
验证器是继承自“Phalcon \ Mvc \ Model \ Validator”并实现“Phalcon \ Mvc \ Model \ ValidatorInterface”的类:
<?php
use Phalcon\Mvc\Model\Validator,
Phalcon\Mvc\Model\ValidatorInterface;
class HashValidator extends Validator implements ValidatorInterface
{
public function validate($record)
{
$fieldName = $this->getOption('field');
if (!preg_match('/[a-z]+/', $fieldName) {
$this->appendMessage("The hash is not valid", $fieldName, "Hash");
return false;
}
return true;
}
}
如果您不想重复使用验证器,只需将验证规则添加到模型中即可:
<?php
use Phalcon\Mvc\Model\Message;
class Users extends Phalcon\Mvc\Collection
{
public function validation()
{
if (!preg_match('/[a-z]+/', $this->password) {
$this->_errorMessages[] = new Message("The hash is not valid", "password", "Hash");
return false;
}
return true;
}
public function getMessages()
{
return $this->_errorMessages;
}
}
3- Phalcon \ Mvc \ Model \ Validator \ Uniqueness验证器NOSQL是否兼容? 此验证器仅与SQL模型兼容,但是,您可以通过以下方式创建验证器以使用NoSQL集合:
<?php
use Phalcon\Mvc\Model\Validator,
Phalcon\Mvc\Model\ValidatorInterface;
class UniqueValidator extends Validator implements ValidatorInterface
{
public function validate($record)
{
$field = $this->getOption('field');
if ($record->count(array("field" => $record->readAttribute($field)))) {
$this->appendMessage("The ".$field." must be unique", $fieldName, "Unique");
return false;
}
return true;
}
}
答案 1 :(得分:1)
我遇到了验证程序在更新文档时失败的问题。该字段确实存在,但它存在于我正在更新的文档中。 更新时,这将检查是否有任何其他文档具有相同的值。
<?php
use MongoId,
MongoRegex,
Phalcon\Mvc\Model\Validator,
Phalcon\Mvc\Model\ValidatorInterface;
class UniqueValidator extends Validator implements ValidatorInterface
{
public function validate($record)
{
$idValue = $record->readAttribute('_id');
$field = $this->getOption('field');
$fieldValue = $record->readAttribute($field);
$conditions = array($field => $fieldValue));
if(isset($idValue))
{
$conditions['_id'] = array('$ne' => $idValue);
}
if( $record->count(array('conditions' => $conditions)) )
{
$this->appendMessage("The " . $field . " must be unique", $field, "Unique");
return FALSE;
}
else
return TRUE;
}
}
答案 2 :(得分:0)
twistedxtra验证器的修正版:
<?php
use Phalcon\Mvc\Model\Validator,
Phalcon\Mvc\Model\ValidatorInterface;
class UniqueValidator extends Validator implements ValidatorInterface
{
public function validate($record)
{
$field = $this->getOption('field');
if ($record->count(['conditions'=>[$field => $record->readAttribute($field)]])) {
$this->appendMessage("The " . $field . " must be unique", $field, "Unique");
return false;
}
return true;
}
}