twodee/phypes

为常用数据值对象提供验证组件。

dev-master 2019-11-06 03:44 UTC

This package is auto-updated.

Last update: 2024-09-06 14:39:26 UTC


README

Build Status Scrutinizer Code Quality

一个带有类型验证的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接口并添加验证器来创建任何新的类型。库已经提供了一套标准验证器,它们可以满足许多用例。

错误标准代码列表可以在TypeErrorCodeRuleErrorCode抽象类中找到。它们可以用来确定在验证过程中返回的错误类型,应用程序可以抛出自定义验证错误,而无需依赖于库中定义的通用错误消息。