jessarcher/laravel-castable-data-transfer-object

使用Spatie的数据传输对象类,在Laravel中自动将JSON列转换为丰富的PHP对象

v2.3.0 2023-03-14 23:07 UTC

This package is auto-updated.

Last update: 2024-09-15 02:43:09 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Laravel很棒。Spatie的数据传输对象包对于PHP来说也很棒。它们已经是好朋友了,但现在他们要把关系提升到下一个层次 💕

你是否曾经想要将你的JSON列转换为值对象?

此包提供了Spatie的DataTransferObject类的扩展版本,称为CastableDataTransferObject

在内部,它实现了Laravel的Castable接口,并使用Laravel的custom cast来处理在DataTransferObject(或兼容的数组)和你的JSON数据库列之间的序列化。

关于它实际做了什么以及背后的动机的深入解释,请查看产生的博客文章

此包还已在Laravel News上展示!

安装

您可以通过composer安装此包

composer require jessarcher/laravel-castable-data-transfer-object

用法

1. 创建你的CastableDataTransferObject

查看readme以了解Spatie的数据传输对象包,了解更多关于他们的DataTransferObject类可以做什么。

namespace App\Values;

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

class Address extends CastableDataTransferObject
{
    public string $street;
    public string $suburb;
    public string $state;
}

(注意:我喜欢将它们放在App\Values中,因为我在将它们用作值对象,而不仅仅是普通的数据传输对象。你可以把它放在任何你喜欢的地方!)

2. 配置你的Eloquent属性以将其转换为它

请注意,这应该是你的数据库模式中的jsonbjson列。

namespace App\Models;

use App\Values\Address;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'address' => Address::class,
    ];
}

就这样!你现在可以传递你的Address类的实例,甚至只是一个具有兼容结构的数组。它将自动在类和JSON之间进行转换,并在存储时进行验证。

$user = User::create([
    // ...
    'address' => [
        'street' => '1640 Riverside Drive',
        'suburb' => 'Hill Valley',
        'state' => 'California',
    ],
])

$residents = User::where('address->suburb', 'Hill Valley')->get();

但最好的部分是,你可以通过添加领域特定方法来装饰你的类,将其转变为功能强大的值对象。

$user->address->toMapUrl();

$user->address->getCoordinates();

$user->address->getPostageCost($sender);

$user->address->calculateDistance($otherUser->address);

echo (string) $user->address;

为空数据库值使用默认值

默认情况下,如果数据库值为null,则模型属性也将为null。然而,有时你可能希望使用一些默认值来实例化属性。

为了实现这一点,你可以提供一个额外的nullable Cast Parameter,以确保转换器被实例化。

namespace App\Models;

use App\Values\Address;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'settings' => Settings::class . ':nullable',
    ];
}

这将确保即使数据库中的settings列是nullSettings转换器也会被实例化。

然后你可以指定一些默认值,这些值将用于代替。

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

class Settings extends CastableDataTransferObject 
{
    public string $title = 'Default';
}

控制序列化

你可以通过向你的对象添加CastUsingJsonFlags属性来向转换器提供用于序列化的标志

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;
use JessArcher\CastableDataTransferObject\CastUsingJsonFlags;

#[CastUsingJsonFlags(encode: JSON_PRESERVE_ZERO_FRACTION)]
class Address extends CastableDataTransferObject {}

测试

composer test

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件jess@jessarcher.com进行报告,而不是使用问题跟踪器。

致谢

许可协议

MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件

Laravel 包模板

此包是使用Laravel 包模板生成的。