emirhanbalkac/utf8-supported-mapper-php

模型映射、取消映射和验证

v2.2.16 2017-03-17 14:04 UTC

README

功能列表

  • 从json、xml、数组和其他对象映射PHP类属性。
  • 从模型到json、xml、数组和stdClass取消映射
  • 支持嵌套模型
  • 注解提供模型属性的定制名称、类型和规则
  • 正确注解的映射模型可以针对不同类型和规则进行验证

安装

composer require runz0rd/mapper-php

工作原理

映射器会遍历模型的所有属性名(使用@name可以更改属性名映射),如果可用,则从源(json/xml/数组/stdClass)映射相同名称的属性。映射的模型可以直接使用,但建议在映射后对其进行验证。必须设置的属性(@required)必须始终设置,并且类型正确(如果使用@var或@rule设置)。非必须属性可以不设置(null),但如果设置,则必须匹配定义的类型或规则(如果使用@var或@rule设置)以通过验证。因此,如果您有

{
  "name": "Jack",
  "type": "human",
  "age": 35,
  "isEmployed": true,
  "custom-desc": "lazy"
}

您可以创建如下模型

class SomeGuy {

    /**
     * @required
     * @var string
     */
    public $name;    

    /**
     * @required createSomeGuy
     * @var string
     */
    public $type;    

    /**
     * @rule limit(1,150)
     * @var integer
     */
    public $age;    

    /**
     * @var boolean
     */
    public $isEmployed;    
    
    /**
     * @name custom-desc
     * @var string
     */
    public $description
}

如果以下条件之一成立,验证将 失败

  • 使用 createSomeGuy 操作,而没有(null) $type(仅在createSomeGuy操作中必需)
  • 没有(null) $name(始终必需)
  • 使用 createSomething 操作,且 $type 不是一个字符串
  • $name 不是一个字符串
  • $age 已设置(非null),但不是一个整数,或在1到150之间(规则)
  • $isEmployed 已设置(非null)但不是一个布尔值

请注意,$description 将被映射,因为它设置了@name注解,并且在源中有一个匹配该名称的属性(custom-desc)。

注解

以下是我们可以用于模型中的注解列表

@var 注解类型列表

用法

映射

在您的模型中使用MappableTrait来调用模型本身的函数

$model->mapFromArray($myArray);
$model->mapFromJson($myJson);
$model->mapFromXml($myXml);
$model->mapFromObject($myObject);

或通过使用ModelMapper类,向其提供要映射的模型实例和源对象

$model = new Model();
$mapper = new ModelMapper();
$mapper->map($sourceObject, $model);

取消映射

在您的模型中使用ConvertibleTrait来调用模型本身的函数

$myArray = $model->toArray();
$myJson = $model->toJson();
$myXml = $model->toXml();
$myObject = $model->toObject();

或通过使用ModelMapper类,向其提供映射的模型(转换为stdClass)

$mapper = new ModelMapper();
$myObject = $mapper->unmap($myModel);

验证

验证将检查您的映射模型的属性类型、自定义规则以及属性是否必需。

使用ValidatableTrait验证您的映射模型,通过提供所需的验证操作

$model->validate('createAction');

或者如果您只想验证始终必需的属性

$model->validate();

您还可以使用验证器本身

$model = new Model();
$validator = new ModelValidator();
$validator->validate($model, 'myAction');

规则

规则用于对映射属性值进行自定义验证。

/**
 * @rule email
 */
public $email;

这将检查属性值是否包含有效的电子邮件字符串。

您可以传递额外的参数给规则。

/**
 * @rule limit(0,99)
 */
public $value;

如果设置正确,这个自定义规则将检查属性值是否在0到99之间。

规则设置

让我们使用上面的limit规则示例来创建一个新的自定义规则

use Common\ModelReflection\ModelProperty;
use Validator\IRule;
use Validator\ModelValidatorException;

class LimitRule implements IRule {

    function getNames() {
        return ['limit'];
    }

    function validate(ModelProperty $property, array $params = []) {
        if($property->getPropertyValue() < $params[0] || $property->getPropertyValue() > $params[1]) {
            throw new ModelValidatorException('Value is not between '.$params[0].' and '.$params[1]);
        }
    }
}

在上面的例子中,我们可以通过以下方式配置一个新的规则

  • 定义一个名称(别名)数组,这些名称用作注解中的规则名称(getNames)
  • 提供验证定义,如果不通过则抛出异常(validate)
  • 规则参数(0,99)通过$params数组以提供顺序传递

欲获取更多信息,请参阅预定义的规则类和IRule接口。

加载您的规则

$model = new Model();
$myCustomRule = new MyCustomRule();
$validator = new ModelValidator();
$validator->useRule($myCustomRule);
$validator->loadRules('/path/to/rules/');
$validator->validate($model, 'myAction');

在上面的示例中,我们可以通过逐个提供规则(使用useRule)或提供包含规则的目录路径(使用loadRules)来使用自定义规则。

代码示例

请参阅其中使用的测试和模型。

启发我的事物

cweiske/jsonmapper