3

我正在尝试通过特殊验证事件来验证数据完整性。我的 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 实现我们自己的验证器。但是,这个类似乎不存在。

所以,我的问题是:

  1. 如何显示作为验证结果的错误消息?
  2. 如何创建自定义验证器?
  3. Phalcon\Mvc\Model\Validator\Uniqueness 验证器 NOSQL 是否兼容?

感谢您的时间。

4

3 回答 3

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;
    }

}
于 2012-12-14T10:17:00.383 回答
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;
    }
}
于 2014-04-18T03:22:05.877 回答
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;
    }
}
于 2013-04-26T16:31:34.440 回答