wp-grogu/laravel-fluent-plus

A fork from janpantel/laravel-fluent-plus
4,987
Install
composer require wp-grogu/laravel-fluent-plus
Latest Version:v3.0.0
PHP:^8.2
License:MIT
Last Updated:Sep 4, 2025
Links: GitHub  ·  Packagist
Maintainer: tgeorgel

Laravel Fluent Plus

This package extends Laravel's Fluent class to provide a supercharged experience like type casting and recursive Fluent access to sub-assocs.

Installation

Use composer to grep the package :

composer require wp-grogu/laravel-fluent-plus

Basic usage

Instead of extending Illuminate\Support\Fluent you extend Grogu\FluentPlus\FluentPlus instead. As this class is a superset of Fluent it can be treated as a drop in replacement.

FluentPlus implements a $casts property that defines how the attributes of your assoc should be cast.

For the following example assume NamesContainer, Price and StockLevel to be classes extending Fluent or FluentPlus as well.

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
        ],
    ];
}

The resulting object now offers convenient property access:

$container = new MyContainer($sourceAssoc);

var_dump($container->names->english);
var_dump($container->prices[0]->amount);
var_dump($container->stock->get('store_1')->quantity);

The problem this package solves

If you work with assocs a lot and like using property access over assoc access Laravel's Fluent class is a convenient way to do so.

The use case that made me write this package is working with responses fetched from 3rd party APIs. Since I want to use @property PHP docs to have "type safety" while not manually assigning properties.

Advanced usage

Recursive array casts

FluentPlus casts sub-assocs that do not have a cast defined into other FluentPlus for infinite dimension property access.

$instance = new Fluent(['foo' => ['bar' => 'baz']]);
$instancePlus = new FluentPlus(['foo' => ['bar' => 'baz']]);

// breaks :(
var_dump($instance->foo->bar);
// works :)
var_dump($instancePlus->foo->bar);

You can turn this feature off by setting the $recursive property in your derived FluentPlus to false or using the NonRecursiveFluentPlus utility class if you want to inline it instead.

Related Packages

doctrine/dbal

Powerful PHP database abstraction layer (DBAL) with many features for database s...

637,827,751 9,703
laravel/framework

The Laravel Framework.

584,532,650 34,931
laravel/tinker

Powerful REPL for the Laravel framework.

498,216,183 7,442
laravel/serializable-closure

Laravel Serializable Closure provides an easy and secure way to serialize closur...

413,412,504 609
nunomaduro/collision

Cli error handling for console/command-line PHP applications.

391,429,217 4,660