wp-grogu/laravel-fluent-plus

由 janpantel/laravel-fluent-plus 分支而来

v1.1.0 2024-04-12 08:19 UTC

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 属性,该属性定义了您的关联属性应该如何转换。

以下示例假设 NamesContainerPriceStockLevel 是扩展 FluentFluentPlus 的类。

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 工具类来关闭此功能(如果您想内联它)。