fatcode/hydration

PHP7 的填充/提取库

1.0.0 2019-04-18 20:22 UTC

This package is auto-updated.

Last update: 2024-09-19 08:27:28 UTC


README

安装

composer require fatcode/hydration

Hydration

Hydration 是一个从一组数据中填充对象的过程。存储库提供填充和提取数据集的机制和接口。

模式

模式是一个描述数据集如何填充的对象。应该将模式注册到 \FatCode\Hydration\ObjectHydrator 中,以便您的数据可以轻松地进行填充/提取。

<?php
use FatCode\Hydration\Schema;
use FatCode\Hydration\Type;

class MyUser 
{
    private $id;
    private $name;
    private $age;
    private $interests = [];
    
    public function __construct(int $id, string $name, int $age) 
    {
        $this->id = $id;
        $this->name = $name;
        $this->age = $age;
    }
}

class MyUserSchema extends Schema
{
    protected $id;
    protected $name;
    protected $age;
    protected $interests;
    
    public function __construct()
    {
        $this->id = Type::id();
        $this->name = Type::string();
        $this->age = Type::integer();
        $this->interests = Type::array();
    }
    
    // Target class has to be provided so schema knows to which class it is corresponding.
    public function getTargetClass() : string
    {
        return MyUser::class;
    }
}

注意:请确保您的模式属性是受保护的或公共的,这样它们就可以从父类中访问。私有属性将不会被识别,这可能导致 null 值或错误。

在上面的代码中,我们定义了域类 MyUser 和相应的模式类 MyUserSchema。有了这个设置,我们就可以开始填充/提取过程。

使用 ObjectHydrator 进行填充

\FatCode\Hydration\ObjectHydrator 既是所有模式类的注册表,也是通用填充/提取功能提供商。这可能听起来这个类承担了太多的责任,但请记住,在填充/提取过程发生之前,必须通过模式进行描述,而 ObjectHydrator 提供了简化您提取/填充和模式加载工作流程的实用工具。

为了填充/提取对象,必须由 ObjectHydrator 识别模式。有两种方法可以实现这一点:

  • 将模式传递给 \FatCode\Hydration\ObjectHydrator::addSchema 方法
  • 实现并传递 \FatCode\Hydration\SchemaLoader 实例给 \FatCode\Hydration\ObjectHydrator::addSchemaLoader 方法

从现在开始,我们将关注第一种方法。

ObjectHydrator 中注册模式

<?php
use FatCode\Hydration\ObjectHydrator;

$objectHydrator = new ObjectHydrator();
$objectHydrator->addSchema(new MyUserSchema());

上述代码注册了上一章中提供的模式。从这一点开始,任何 MyUser 类的实例都可以使用 ObjectHydrator 进行填充或提取。

填充对象

<?php
use FatCode\Hydration\ObjectHydrator;

$objectHydrator = new ObjectHydrator();
$objectHydrator->addSchema(new MyUserSchema());

// Hydration
$bob = $objectHydrator->hydrate(
    [
        'id' => 1,
        'name' => 'Bob',
        'age' => 30,
        'interests' => ['Flowers', 'Judo', 'M1lf$']
    ], 
    MyUser::class
);

提取对象

<?php
use FatCode\Hydration\ObjectHydrator;

$objectHydrator = new ObjectHydrator();
$objectHydrator->addSchema(new MyUserSchema());
$bob = new MyUser(1, 'Bob', 30);
$dataset = $objectHydrator->extract($bob); // ['id' => 1, 'name' => 'Bob', 'age' => 30, 'interests' => []]