twodee/ phypes
为常用数据值对象提供验证组件。
Requires
- php: >=7.2
- ext-mbstring: *
Requires (Dev)
- mockery/mockery: ^1.1
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-09-06 14:39:26 UTC
README
一个带有类型验证的PHP值对象库。
简介
Phypes是一个完全可扩展的值对象库,包含常用类型,允许用户进行输入验证和数据存储。
Phypes有3个组件
- 类型
- 验证器
- 规则
类型是由用户输入创建的不可变对象,并将其传递到业务层的服务中,以存储/操作/使用数据。
验证器会检查每个类型的输入,并在验证失败时抛出InvalidArgumentException
异常,同时附带错误信息和描述错误代码。
验证器可以通过“规则”进一步辅助。规则是用于原子级别验证的帮助类。处理和验证具有非常简单指定的原始数据,例如:你可能想要检查提供的字符串长度是否超过你的限制。一组规则定义了一个验证器。
库中已提供一组具有验证器的标准数据类型。对于自定义验证,用户可以轻松地将用户定义的验证器作为参数传递给类型。
安装
推荐通过composer安装Phypes
composer require twodee/phypes
从GitHub获取最新版本
git clone git://github.com/2DSharp/phypes.git
使用
创建需要类型的实体类作为依赖项
User.php
class User { private $email; private $password; public function __construct(Email $email, Password $password) { $this->email = $email; $this->password = $password; } public function getEmail() { return $this->email; } public function getPassword() { //hash at this point maybe? return $this->password; } }
从浏览器检索数据并将其存储在其正确的类型中
SignUpController.php
try { // Get the user data $email = new Email($_POST['email']); $pass = new Password($_POST['password']); // Create a new user account based on the data $user = new User($email, $password); // Update the user database $userMapper = new UserMapper(); $userMapper->register($user); } catch(\InvalidArgumentException $e) { $this->displayError($e->getMessage()); }
如果你不喜欢我们的验证器实现,不必使用它们!你可以插入自己的验证器,并使用自定义规则,Phypes会为你做剩下的。
话虽如此,你需要非常小心,不要将一个无关的验证器注入到一个类型中。将密码验证器注入到电子邮件类型中永远不会有意义。实际上,它会改变电子邮件类型的整个意义。
作为一个经验法则,只要你不真的需要为给定的类型创建自定义验证器,就使用捆绑的类型和验证器。
要注入自定义验证器,实现Validator
接口
CustomPasswordValidator.php
<?php declare(strict_types=1); namespace Sample\Foo; use Phypes\Validator\Validator; use Phypes\Error\TypeError; use Phypes\Error\TypeErrorCode; use Phypes\Rule\String\MinimumLength; use Phypes\Result; class CustomPasswordValidator implements Validator { private function isLongEnough(string $password) : bool { return (new MinimumLength(8))->validate($password)->isValid(); } public function validate($password, $options = []): Result\Result { if (!$this->isLongEnough($password)) { $error = new TypeError(TypeErrorCode::PASSWORD_TOO_SMALL, 'The password is not at least 8 characters long'); return new Result\Failure($error); } return new Result\Success(); } }
验证器和规则总是在验证后返回一个Result
。你可以使用Result::isValid()
来找出它是否成功。
如果验证失败,你可以使用Result::getErrors()
或Result::getFirstError()
获取错误。
然后只需在类型中切换到自定义验证器。
$pass = new Password($_POST['password'], new CustomPasswordValidator());
就这样。密码将根据你的验证规则进行验证。
可以通过实现Type
接口并添加验证器来创建任何新的类型。库已经提供了一套标准验证器,它们可以满足许多用例。
错误标准代码列表可以在TypeErrorCode
和RuleErrorCode
抽象类中找到。它们可以用来确定在验证过程中返回的错误类型,应用程序可以抛出自定义验证错误,而无需依赖于库中定义的通用错误消息。