janpantel / laravel-fluent-plus
为 Laravel 的 Fluent 类添加实用辅助程序的包
dev-master
2020-01-07 14:51 UTC
Requires
- php: ^7.3
- illuminate/support: ^6.8
Requires (Dev)
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-11 01:59:49 UTC
README
此包扩展 Laravel 的 Fluent
类,提供类型转换和递归 Fluent 访问子关联的超级体验。
基本用法
您不是扩展 Illuminate\Support\Fluent
,而是扩展 JanPantel\LaravelFluentPlus\FluentPlus
。因为这个类是 Fluent 的超集,所以它可以作为直接替换。
FluentPlus
实现了一个 $casts
属性,该属性定义了您的关联属性应该如何转换。
对于以下示例,假设 NamesContainer
、Price
和 StockLevel
是扩展 Fluent
或 FluentPlus
的类。
class MyContainer extends FluentPlus { protected $casts = [ // Use the contents of the `names` attribute // to initialize a new `NamesContainer` instance. 'names' => NamesContainer::class, // Assumes that the `price` attribute contains // an array and initializes a new `Price` instance // for every item. 'prices' => [Price::class], // The same as the array syntax but using // Laravel's `Collection` class instead. 'stock' => [ \Illuminate\Support\Collection::class, StockLevel::class ], ]; }
现在生成的对象提供了方便的属性访问
$container = new MyContainer($sourceAssoc); var_dump($container->names->english); var_dump($container->prices[0]->amount); var_dump($container->stock->get('store_1')->quantity);
此包解决的问题
如果您经常与关联一起工作,并且喜欢使用属性访问而不是关联访问,那么 Laravel 的 Fluent
类是做这件事的一个方便的方法。
促使我编写这个包的用例是处理从第三方 API 获取的响应。由于我想使用 @property
PHP 文档来获得“类型安全”,而无需手动分配属性。
高级用法
递归数组转换
FluentPlus
将未定义转换的子关联转换为其他 FluentPlus
,以实现无限维度的属性访问。
$instance = new Fluent(['foo' => ['bar' => 'baz']]); $instancePlus = new FluentPlus(['foo' => ['bar' => 'baz']]); // breaks :( var_dump($instance->foo->bar); // works :) var_dump($instancePlus->foo->bar);
您可以通过将您的派生 FluentPlus
中的 $recursive
属性设置为 false
或使用 NonRecursiveFluentPlus
工具类来关闭此功能,如果您想将其内联。