【问题标题】:Custom Validation with Phalcon Model使用 Phalcon 模型进行自定义验证
【发布时间】:2015-10-02 11:54:19
【问题描述】:

我正在尝试为我的模型实施自定义验证。我目前正在成功使用 Phalcon 库中包含的验证器,但是当我尝试实现我的验证器时,它不起作用。这是我的代码:

    <?php

use Phalcon\Mvc\Model\Validator;
use Phalcon\Mvc\Model\ValidatorInterface;
use Phalcon\Mvc\EntityInterface;

class MaxMinValidator extends Validator implements ValidatorInterface
{

    public function validate(EntityInterface $model)
    {
        $field  = $this->getOption('field');

        $min    = $this->getOption('min');
        $max    = $this->getOption('max');

        $value  = $model->$field;

        if ($min <= $value && $value <= $max) {
            $this->appendMessage(
                "The field doesn't have the right range of values",
                $field,
                "MaxMinValidator"
            );
            return false;
        }
        return true;
    }
}

我正在尝试在我的模型中这样使用它:

public function validation()
{
        $this->validate(new MaxMinValidator(
            array(
                "field" => "Email",
                "min"   => 10,
                "max"   => 100
            )
        ));
 }

该类已正确加载,但未执行验证功能,并且我的代码在尝试验证后停止执行。 注意:这与找到的代码完全相同 here

【问题讨论】:

  • 你在哪里创建了你的类?你注册了目录或命名空间吗?
  • 我在我已在引导文件中注册的验证器目录下创建了该类。
  • 您的 phalcon 版本是多少? (从 phpinfo() 检查它)

标签: php validation phalcon


【解决方案1】:

1.检查您的验证器类是否正确加载。 (创建一个函数并编写 die("sth");) 如果调用该函数导致您的应用程序死亡,则您正确加载了该类。

2.检查您的 phalcon 版本,如果它低于 2.0.5,您应该将您的验证器代码修改为:

<?php

use Phalcon\Mvc\Model\Validator;
use Phalcon\Mvc\Model\ValidatorInterface;
use Phalcon\Mvc\EntityInterface;

class MaxMinValidator extends Validator implements ValidatorInterface
{
    public function validate(\Phalcon\Mvc\ModelInterface $model)
    {
         $field  = $this->getOption('field');
         $min    = $this->getOption('min');
         $max    = $this->getOption('max');

         $value  = $model->$field;

         if ($min <= $value && $value <= $max) {
             $this->appendMessage(
             "The field doesn't have the right range of values",
             $field,
             "MaxMinValidator"
             );
            return false;
        }
        return true;
    }
}

如果您的 phalcon 版本是 2.0.5 并且您的类已加载但您看不到验证错误消息,请将此方法添加到您的模型类:

public function getMessages() {
    $messages = array();
    foreach (parent::getMessages() as $message) {
        switch ($message->getType()) {
            case 'InvalidCreateAttempt':
                $messages[] = 'The record cannot be created because it already exists';
                break;
            case 'InvalidUpdateAttempt':
                $messages[] = 'The record cannot be updated because it already exists';
                break;
            case 'PresenceOf':
                $messages[] = 'The field ' . $message->getField() . ' is mandatory';
                break;
            case 'MaxMinValidator':
                $messages[] = 'The field ' . $message->getField() . ' is not in range';
                break;
        }
    }
    return $messages;
}

【讨论】:

    【解决方案2】:

    你检查了整个函数吗?

    public function validation()
    {
            $this->validate(new MaxMinValidator(
                array(
                    "field" => "Email",
                    "min"   => 10,
                    "max"   => 100
                )
            ));
    
            // This line:
            return $this->validationHasFailed() != true;
     }
    

    我认为你错过了运行validationHasFailed 方法。

    【讨论】:

    • 我有这一行: if ($this->validationHasFailed() == true) { return false; } 虽然它甚至没有机会得到那条线。
    • 嗯,那就不一样了。我会尝试更多地研究它——我对此很好奇。
    • 可能是 2.0 版本的 bug,如果你也遇到同样的情况,我会尝试更新到 2.0.5,如果仍然出现,我会在 github 上打开一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多