fi1a/hydrator

PHP hydrator 是一个用于将数据从数组转移到对象,以及从对象转移到数组的库

1.2.1 2023-02-21 01:37 UTC

This package is auto-updated.

Last update: 2024-09-21 05:30:19 UTC


README

Latest Version Software License PHP Version Coverage Status Total Downloads Support mail

该库允许将数据从数组转移到对象,以及从对象转移到数组。

以下是一些可能的操作

  • 将数据从 Object 转换为 Array;
  • 使用 Array 填充 Object

安装

可以使用 Composer 将此包作为依赖项安装。

composer require fi1a/hydrator

Hydrator. 从数组到对象的转移数据

Fi1a\Hydrator\Hydrator() 允许填充对象。示例

use Fi1a\Hydrator\Hydrator;

class Foo {
    /**
     * @var string
     */
    public $propertyBar;
    
    /**
     * @var int
     */
    protected $propertyBaz;

    /**
     * @var bool
     */
    private $propertyQux;
}

$hydrator = new Hydrator();

/**
 * @var Foo $model
 */
$model = $hydrator->hydrate([
    'propertyBar' => 'value',
    'propertyBaz' => 1,
    'propertyQux' => true,
], Foo::class);

$model->propertyBar; // 'value'

hydrate 方法创建传递的类的新对象,若要使用已存在的对象填充数据,则需要使用 hydrateModel 方法。

use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\Hydrate;

class Foo {
    /**
     * @var string
     */
    public $propertyBar;

    /**
     * @var int
     */
    protected $propertyBaz;

    /**
     * @var bool
     */
    private $propertyQux;
}

$hydrator = new Hydrator();

$model = new Foo();

$hydrator->hydrateModel([
    'propertyBar' => 'value',
    'propertyBaz' => 1,
    'propertyQux' => true,
], $model);

$model->propertyBar; // 'value'

Fi1a\Hydrator\Hydrates\Hydrate 行为

用于从数组到对象转移数据,而不调用对象的setter方法。这是默认行为。

use Fi1a\Hydrator\Hydrator;

class Foo {
    /**
     * @var string
     */
    public $propertyBar;
    
    /**
     * @var int
     */
    protected $propertyBaz;

    /**
     * @var bool
     */
    private $propertyQux;
}

$hydrator = new Hydrator();

/**
 * @var Foo $model
 */
$model = $hydrator->hydrate([
    'propertyBar' => 'value',
    'propertyBaz' => 1,
    'propertyQux' => true,
], Foo::class);

$model->propertyBar; // 'value'

Fi1a\Hydrator\Hydrates\HydrateCallSetters 行为

用于从数组到对象转移数据,并调用setter方法。

use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\HydrateCallSetters;

class Foo {
    public $propertyBar;

    protected $propertyBaz;

    private $propertyQux;

    protected function setPropertyBaz(int $propertyBaz): void
    {
        $this->propertyBaz = $propertyBaz + 1;
    }

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}


$hydrator = new Hydrator(new HydrateCallSetters());

/**
 * @var Foo $model
 */
$model = $hydrator->hydrate([
    'propertyBar' => 'value',
    'propertyBaz' => 1,
    'propertyQux' => true,
], Foo::class);

$model->getPropertyBaz(); // 2

Fi1a\Hydrator\Hydrates\HydratePublicCallSetters 行为

用于从数组到对象转移数据,并只调用公共setter方法。

use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\HydratePublicCallSetters;

class Foo {
    public $propertyBar;

    protected $propertyBaz;

    private $propertyQux;

    public function setPropertyBaz(int $propertyBaz): void
    {
        $this->propertyBaz = $propertyBaz + 2;
    }

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}


$hydrator = new Hydrator(new HydratePublicCallSetters());

/**
 * @var Foo $model
 */
$model = $hydrator->hydrate([
    'propertyBar' => 'value',
    'propertyBaz' => 1,
    'propertyQux' => true,
], Foo::class);

$model->getPropertyBaz(); // 3

Extractor. 从对象到数组的转移数据

Fi1a\Hydrator\Extractor() 从对象到数组提取数据。示例

use Fi1a\Hydrator\Extractor;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;
}

$model = new Foo();

$hydrator = new Extractor();

$data = $hydrator->extract($model); // ['propertyBar' => 'value',]

可以使用 Fi1a\Hydrator\Extractor::extract 方法的 $keys 参数指定要提取哪些属性。

use Fi1a\Hydrator\Extractor;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;
}

$model = new Foo();

$hydrator = new Extractor();

$data = $hydrator->extract($model, ['propertyBar', 'propertyBaz']); // ['propertyBar' => 'value', 'propertyBaz' => 1,]

Fi1a\Hydrator\Extracts\ExtractPublicCallGetters 行为

从对象到数组转移数据,调用公共getter方法。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有公共属性和具有公共getter的属性,否则将仅获取传递的属性。这是默认行为。

use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractPublicCallGetters;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}

$model = new Foo();

$hydrator = new Extractor(new ExtractPublicCallGetters());

$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1,]

Fi1a\Hydrator\Extracts\ExtractCallGetters 行为

从对象到数组转移数据,调用getter方法。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有属性和调用它们的getter,否则将仅获取传递的属性。

use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractCallGetters;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}

$model = new Foo();

$hydrator = new Extractor(new ExtractCallGetters());

$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1, 'propertyQux' => true]

Fi1a\Hydrator\Extracts\ExtractPublic 行为

从对象到数组转移公共属性。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有公共属性,否则将仅获取传递的属性。

use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractPublic;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}

$model = new Foo();

$hydrator = new Extractor(new ExtractPublic());

$data = $hydrator->extract($model); // ['propertyBar' => 'value',]

Fi1a\Hydrator\Extracts\Extract 行为

从对象到数组转移数据。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有属性,否则将仅获取传递的属性。

use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\Extract;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}

$model = new Foo();

$hydrator = new Extractor(new Extract());

$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1, 'propertyQux' => true]

数组键的名称

使用实现 Fi1a\Hydrator\KeyName\KeyNameInterface 接口 的类来确定数组键的名称。将此类对象传递给数据转移的构造函数,以从数组到对象以及从对象到数组转移数据。

  • Fi1a\Hydrator\KeyName\Camelize 将数组键名称转换为 "stringHelper"。
  • Fi1a\Hydrator\KeyName\Humanize 将数组键名称转换为 "string_helper"。

默认情况下,使用 "stringHelper" 作为数组键名称(Fi1a\Hydrator\KeyName\Camelize)。

示例:将数据从数组到对象转移,数组键名称为 "string_helper"。

use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\Hydrate;
use Fi1a\Hydrator\KeyName\Humanize;

class Foo {
    /**
     * @var string
     */
    public $propertyBar;

    /**
     * @var int
     */
    protected $propertyBaz;

    /**
     * @var bool
     */
    private $propertyQux;
}

$hydrator = new Hydrator(new Hydrate(new Humanize()));

$model = new Foo();

$hydrator->hydrateModel([
    'property_bar' => 'value',
    'property_baz' => 1,
    'property_qux' => true,
], $model);

$model->propertyBar; // 'value'

示例:将数据从对象到数组转移,数组键名称为 "string_helper"。

use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\Extract;
use Fi1a\Hydrator\KeyName\Humanize;

class Foo {
    /**
     * @var string
     */
    public $propertyBar = 'value';

    /**
     * @var int
     */
    protected $propertyBaz = 1;

    /**
     * @var bool
     */
    private $propertyQux = true;

    public function getPropertyBaz(): int
    {
        return $this->propertyBaz;
    }
}

$model = new Foo();

$hydrator = new Extractor(new Extract(new Humanize()));

$data = $hydrator->extract($model); // ['property_bar' => 'value', 'property_baz' => 1, 'property_qux' => true]