wp-grogu / laravel-fluent-plus
由 janpantel/laravel-fluent-plus 分支而来
v1.1.0
2024-04-12 08:19 UTC
Requires
- php: ^7.3|^8.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-12 09:18:44 UTC
README
此包扩展了 Laravel 的 Fluent
类,以提供类似于类型转换和递归 Fluent 访问子关联的超级充电体验。
安装
使用 composer 获取此包
composer require wp-grogu/laravel-fluent-plus
基本用法
您不需要扩展 Illuminate\Support\Fluent
,而是扩展 Grogu\FluentPlus\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
工具类来关闭此功能(如果您想内联它)。