Клас Fluent у Laravel надає потужні можливості для трансформації даних у класах дій. Перетворюючи масиви на екземпляри Fluent під час передачі атрибутів до дій, ви отримуєте безліч переваг для свого коду.
Хоча масиви забезпечують простий спосіб передачі даних до дій, екземпляри Fluent пропонують зручні методи трансформації та елегантні варіанти валідації. Це особливо корисно під час роботи зі складними даними або реалізації умовної логіки валідації.
Ось базова реалізація:
namespace App\Actions;
use App\Models\Product;
use Illuminate\Support\Fluent;
class CreateProduct
{
// Використовуючи Fluent замість масиву
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')
]);
}
}
// Використання в тестах
it('can create a new product', function() {
$product = (new CreateProduct)->execute(new Fluent([
'name' => 'Преміум навушники',
'description' => 'Бездротові навушники з шумозаглушенням',
'categories' => ['електроніка', 'аудіо'],
'status' => ProductStatus::Active,
'published_at' => now()
]));
});
Підхід Fluent особливо вражає під час реалізації складної валідації з умовними правилами:
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;
}
}
Використання екземплярів Fluent надає більш просунутий підхід до обробки даних у ваших діях та валідаціях. Вони слугують універсальним інструментом для трансформацій, зберігаючи при цьому зрозумілість та читабельність коду. Вбудовані доступи та методи трансформації суттєво зменшують обсяг шаблонного коду, роблячи ваші наміри ясними