Laravel Tutorials

Optimizing Actions with Laravel's Fluent Class

Published
Optimizing Actions with Laravel's Fluent Class image

Laravel's Fluent class delivers enhanced data transformation capabilities for action classes. Converting from arrays to Fluent instances when passing attributes to actions brings numerous advantages to your codebase.

Arrays provide a basic approach for transferring data to actions, but Fluent instances offer integrated transformation methods and more elegant validation options. This becomes particularly valuable when handling sophisticated data transformations or implementing conditional validation logic.

Here's a basic implementation:

namespace App\Actions;
 
use App\Models\Product;
use Illuminate\Support\Fluent;
 
class CreateProduct
{
// Using Fluent instead of array
public function execute(Fluent $data): Product
{
return Product::create([
'name' => $data->name,
'description' => $data->description,
'categories' => $data->array('categories'),
'status' => $data->enum('status', ProductStatus::class),
'published_at' => $data->date('published_at')
]);
}
}
 
// Usage in tests
it('can create a new product', function() {
$product = (new CreateProduct)->execute(new Fluent([
'name' => 'Premium Headphones',
'description' => 'Noise-cancelling wireless headphones',
'categories' => ['electronics', 'audio'],
'status' => ProductStatus::Active,
'published_at' => now()
]));
});

The Fluent approach shines when implementing complex validation with conditional rules:

class PaymentValidator
{
public function validate(array $data)
{
$validator = Validator::make($data, [
'method' => 'required|string',
'amount' => 'required|numeric|min:1'
]);
 
$validator->sometimes(
['account_name', 'routing_number'],
'required',
function (Fluent $input) {
return $input->method === 'bank_transfer';
}
);
 
$validator->sometimes(
'card_verification',
'required|size:3',
function (Fluent $input) {
return $input->get('method') === 'credit_card' &&
$input->get('amount') > 500;
}
);
 
return $validator;
}
}

Using Fluent instances provides a more sophisticated approach to data handling in your actions and validations. It functions as a versatile toolkit for transformations while maintaining code clarity and readability. The built-in accessors and transformation methods significantly reduce boilerplate code while making your intentions explicit.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
CPX: The Composer Package Executor for PHP image

CPX: The Composer Package Executor for PHP

Read article
Laravel AI SDK Adds Human-in-the-Loop Tool Approval image

Laravel AI SDK Adds Human-in-the-Loop Tool Approval

Read article
Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals image

Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals

Read article
Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs image

Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs

Read article
Blade Formatting in Laravel Pint image

Blade Formatting in Laravel Pint

Read article
Inertia DevTools Is Now on the Chrome Web Store image

Inertia DevTools Is Now on the Chrome Web Store

Read article