czim / laravel-dataobject
基本可验证的标准数据对象。
Requires
- php: ^8.0
Requires (Dev)
- ext-json: *
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
README
基本框架,用于创建标准但灵活的数据对象。这提供了一种类(和接口),可用于使用通用数据对象标准化您的依赖项或返回值。
这实际上是一个具有魔法获取器和设置器的数据存储类。它是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)。有关更多信息,请参阅 许可证文件。