imbue/data-transfer-object

1.0.0 2023-05-16 07:50 UTC

This package is auto-updated.

Last update: 2024-09-22 09:49:04 UTC


README

Latest Version Software License Latest Version on Packagist Total Downloads

数据传输对象(DTO)设计模式(分布模式)的变体/解释。DTO只是一个可以包含一些数据的对象。最常见的是用于在系统层之间传输数据。

安装

您可以通过composer安装此包

composer require imbue/data-transfer-object

使用方法

介绍

使用getter/setter方法可以提供类型提示所有要设置的数据。因此,任何数据对象都将透明且易于使用,无需额外的文档,例如您正在编写的API客户端。

获取器 & 设置器

定义获取器

要定义获取器,只需在您的数据对象上创建一个get...()方法

class BookData extends DataTransferObject
{
    protected $title;
    protected $author;

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @return AuthorData
     */
    public function getAuthor(): AuthorData
    {
        return $this->author;
    }
}

定义设置器

要定义设置器,只需在您的数据对象上创建一个set...()方法

class BookData extends DataTransferObject
{
    protected $title;
    protected $author;

    /**
     * @param nullable|string $title
     */
    public function setTitle(?string $title)
    {
        return $this->title;
    }

    /**
     * @param AuthorData $author
     */
    public function setAuthor(AuthorData $author)
    {
        return $this->author;
    }
}

序列化对象 & 集合

序列化到数组

要将值对象及其嵌套对象/集合转换为数组,您可以使用toArray方法。此方法是递归的,因此所有属性都将转换为数组

return $dataObject->toArray();

序列化到JSON

要将值对象及其嵌套对象/集合转换为JSON对象,您可以使用toJson方法。此方法是递归的,因此所有属性都将转换为JSON

return $dataObject->toJson();

集合

在某些情况下,您可能希望有一个包含多个数据对象的集合。通过扩展提供的DataTransferObjectColletion类,您可以轻松设置一组DTO

$collection = new BooksCollection([
    $bookOne,
    $bookTwo,
    $bookThree
]);

$collection->toArray();

集合自动完成

通过重写current()方法并设置返回值,您可以使用类型提示。

class BooksCollection extends DataTransferObjectCollection
{
    public function current(): BookData
    {
        return parent::current();
    }
}
foreach ($booksCollection as $bookData) {
    $bookData-> // type hinting 
}

辅助函数

有几个辅助方法提供了一些额外的功能

only()

$dataObject
    ->only('title')
    ->toArray();

except()

$dataObject
    ->except('title')
    ->toArray();
不可变性

这些辅助函数是不可变的,这意味着它们不会影响原始的数据传输对象。

示例

使用数据对象尽可能简单

$book = new BookData();
$book->setTitle('Harry Potter: The Goblet of Fire');

$author = new Author();
// ....

$book->setAuthor($author);

安全性

如果您发现任何与安全性相关的问题,请使用问题跟踪器。

测试

composer test

鸣谢