标签 / sudzy
用于与Paris(和Idiorm)一起使用的模型验证器。
Requires
- php: >=5.6.0
- j4mie/paris: >=1.4
- respect/validation: ^1.1
Requires (Dev)
- phpunit/phpunit: ^5.7
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()
方法提供。