czim/laravel-dataobject

基本可验证的标准数据对象。

3.0.1 2022-05-18 11:12 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status Latest Stable Version SensioLabsInsight

基本框架,用于创建标准但灵活的数据对象。这提供了一种类(和接口),可用于使用通用数据对象标准化您的依赖项或返回值。

这实际上是一个具有魔法获取器和设置器的数据存储类。它是Arrayable、Jsonable和可验证的。

还提供了使数据对象(包含进一步的数据对象)的嵌套验证成为可能的方法。

版本兼容性

安装

通过Composer

$ composer require czim/laravel-dataobject

用法

简单地创建您的数据对象的基类扩展,并

可选地添加您自己的获取器和设置器

当然,这些都是基本的东西,但如果您想让您的IDE知道您的对象包含什么,您可以简单地编写像这样的获取器和设置器

class TestDataObject extends \Czim\DataObject\AbstractDataObject
{
    public function getName($value)
    {
        $this->getAttribute('name');
    }

    public function setName($value)
    {
        $this->setAttribute('name', $value);
    }
}

另外,如果您想阻止任何类型的魔法赋值(这意味着所有赋值都必须通过setAttribute()setAttributes()方法,或您自己的设置器来完成),您可以按以下方式禁用魔法赋值

class TestDataObject extends \Czim\DataObject\AbstractDataObject
{
    protected $magicAssignment = false;

    ...

尝试通过魔法或数组访问在数据对象上设置属性将抛出UnassignableAttributeException异常。

可选地添加属性验证规则

class YourDataObject extends \Czim\DataObject\AbstractDataObject
{
    protected $rules = [
        'name' => 'required|string',
        'list' => 'array|min:1',
    ];
}

验证数据可以按以下方式进行

    $dataObject = new YourDataObject();

    // validate() returns a boolean, false if it does not follow the rules
    if ( ! $dataObject->validate()) {

        $messages = $dataObject->messages();

        // messages() returns a standard Laravel MessageBag
        dd( $messages->first() );
    }

消息是由Validator生成的MessageBag对象(无论在Laravel Facade Validator后面是什么)。

验证

要使用此包的额外验证功能(用于嵌套数据对象验证规则和更好的数组验证),请加载此包的ServiceProvider。这是加载ServiceProvider的唯一原因;此包本身不需要Provider来运行。

将此行代码添加到您的config/app.php文件中位于提供者数组的位置

    Czim\DataObject\DataObjectServiceProvider::class,

请注意,这将重新绑定Validator外观,因此如果您自己这样做,您可能希望改用提供的验证特性来添加到您自己的扩展验证器类。

有关验证(特性)的更多信息,请参阅这里

可转换数据对象

您可以选择扩展Czim\DataObject\CastableDataObject。除了标准功能外,这还包括将属性转换为标量值或(嵌套)数据对象的可能。

通过覆盖受保护的casts()方法,可以为每个属性键设置转换类型

<?php
protected function casts()
{
    return [
        'check' => 'boolean',
        'count' => 'integer',
        'price' => 'float',
    ];
}

这会将每个属性转换为其设置的类型后再返回。

<?php
$object = new YourDataObject([
    'check' => 'truthy value',
    'price' => 45,
]);

$object->check;     // true
$object['price'];   // 45.0
$object->count;     // 0 (instead of null)

toArray转换

转换类型也应用于数据对象的toArray()方法。这意味着未设置的属性将以它们的默认值(布尔值为false,浮点值为0.0等)在数组中存在。

要禁用此行为,将$castToArray设置为false。这将完全禁用在toArray()上转换值。

嵌套对象转换

与标量转换相比更有用的是对象转换。这允许您创建嵌套对象树,如果设置了,可以流畅地访问。

给定如下设置的转换

<?php
class RootDataObject extends \Czim\DataObject\CastableDataObject
{
    protected function casts()
    {
        return [
            'some_object' => YourDataObject::class,
            'object_list' => YourDataObject::class . '[]',
        ];
    }
}

以及以下数据示例,您可以通过属性访问数据

<?php
$data = [
    'some_object' => [
        'type' => 'peaches',
    ],
    'object_list' => [
        ['type' => 'cucumbers'],
        ['type' => 'sherry'],
    ],
];

$object = new RootDataobject($data);

$object->some_object;           // instance of YourDataObject
$object->some_object->type;     // peaches
$object->object_list[1]->type;  // sherry

请注意,未设置或null值将返回null,而不是空的数据对象。非数组值在被解释为数据对象时将抛出异常。

此行为可以通过将 $castUnsetObjects 属性设置为 true 来更改:随后未设置的属性将转换为此对象类的一个空实例。

贡献

有关详细信息,请参阅 贡献指南

致谢

许可证

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