标签/sudzy

用于与Paris(和Idiorm)一起使用的模型验证器。

v0.3.0 2017-03-14 07:18 UTC

This package is auto-updated.

Last update: 2024-09-13 20:31:56 UTC


README

版本0.3的破坏性更改:现在使用respect/validation验证库进行验证。

Sudzy通过使用Paris/Idiorm(一个常与Slim一起使用的活动记录ORM)来实现对模型类的验证,尽管它很容易进行适配。

Sudzy的ValidModel类装饰了Paris的Model类。通过扩展ValidModel,您的模型类可以立即访问验证。

默认情况下,ValidModel将在模型属性设置(对于现有模型)或新模型保存时存储验证错误,并在遇到错误时在保存时抛出ValidationException

Sudzy的ValidModel类使用Respect/Validation作为其验证引擎。有关详细信息,请参阅该项目。

安装

安装Sudzy最简单的方法是通过Composer。首先创建或添加到项目的composer.json文件

    {
        "require": {
            "tag/sudzy" : "dev-master" // Grab the most recent version from github
        }
    }

ValidModel示例

ValidModel类要求您实现抽象方法#prepareValidations(),以便延迟加载验证。因此,构造函数不会有创建未使用验证对象的开销。

也可以使用#addValidation()方法在任何时候添加验证。

#setValidation()方法接受要监视的模型属性和要检查的Respect验证对象。对同一属性的多次调用将覆盖以前的验证。

Respect\Validation是命名空间化的,但您可以通过将单个类导入上下文来简化您的操作

    use Respect\Validation\Validator as v;
    // Within a `ValidModel` class declaration:

    public function prepareValidation()
    {
        $this->setValidation('username', v::alnum()->noWhitespace()->length(1, 15) );
        $this->setValidation('email', v::email() );
        $this->setValidation('password', v::stringType()->length(6, null)->length(1, 15) );
        $this->setValidation('birthdate', v::date()->age(18));

    }

当使用Respect/validation时,为每个字段创建不同的验证,而不是为整个对象创建单个验证器。

完整示例

示例模型类

namespace Models;

use Respect\Validation\Validator as v;

class User extends \Sudzy\ValidModel
{
    public function prepareValidation()
    {
        $this->setValidation('username', v::alnum()->noWhitespace()->length(1, 15) );
        $this->setValidation('email', v::email() );
        $this->setValidation('password', v::stringType()->length(6, null)->length(1, 15) );
        $this->setValidation('birthdate', v::date()->age(18));
    }
}

示例控制器片段

   // This example assumes Slim context and access to flash messages
   // ... <snip> ...

   $newUser = Model::factory('\Models\User')->create();

   try {
       $newUser->email = $_POST['email'];
       $newUser->password = $_POST['password'];

       $newWard->save();

       $this->flash->addMessage('success', 'New User created.');
   } catch (Sudzy\ValidationException $sve) {
       foreach ($sve->getMessages() as $msg) {
           $this->flash->addMessage('error', $msg);
       }
   }

验证异常和错误

默认情况下,Sudzy的ValidModel在对象通过#save()提交到数据库时进行验证检查,但可以配置为在设置属性时抛出异常,或根本不抛出。

由于对象可以有多个字段失败,因此有必要捕获并包装Respect的异常。

:TODO

验证失败被存储,并通过getValidationErrors()方法(既是ValidModel对象的方法也是抛出的ValidationException的方法)提供。在尝试保存时,未通过验证的对象抛出ValidationException(默认行为)。可以通过设置throw选项将其更改为::ON_SET::NEVER

$model->setValidationOptions(
    array('throw' => self::ON_SET)
);

小心使用::ON_SET,因为当模型通过Paris的方法hydrate()create()构建时,Paris的内部set()方法不会被调用。此外,::ON_SET立即触发验证异常,而::ON_SAVE允许在抛出异常之前验证所有字段。

无论throw选项的值如何,在设置属性时都会进行验证检查。在新的模型(如使用Paris方法create()hydrate()构建的模型)的情况下,在保存时也会进行验证检查。无论何时抛出(或不抛出)异常,错误都会立即通过getValidationErrors()方法提供。