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 →
Laravel MCP 1.0 Is Released image

Laravel MCP 1.0 Is Released

Read article
Laravel Vet: Review Composer Code Before It Installs image

Laravel Vet: Review Composer Code Before It Installs

Read article
What's New in PHP 8.6 image

What's New in PHP 8.6

Read article
Building EasyReply: How We Used Laravel to Unify Customer Support image

Building EasyReply: How We Used Laravel to Unify Customer Support

Read article
PostgreSQL Monitoring and Schema Linting for Laravel with Vacuum image

PostgreSQL Monitoring and Schema Linting for Laravel with Vacuum

Read article
PayZephyr: One Payment API for Stripe, Paystack, and PayPal image

PayZephyr: One Payment API for Stripe, Paystack, and PayPal

Read article