Спростимо умовну логіку за допомогою Fluent Conditionable Trait у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 24 травня, 2025
Ларавел не тільки спрощує роботу з кодом, але й надає новий рівень читабельності завдяки трейту Conditionable. Досліджуйте, як ця функція змінює традиційні умови в коді на більш зрозумілі та інтуїтивно зрозумілі конструкції, які покращують вашу розробку!

Laravel підвищує читабельність коду, додаючи trait Conditionable до класу Fluent. Це дозволяє розробникам виконувати умовні операції через зручний інтерфейс, зберігаючи ланцюги викликів методів без порушення логіки виконання коду.

Trait Conditionable дозволяє виконувати операції умовно за допомогою методів when() і unless(), перетворюючи традиційні if-else на виразний, майже природний код. Такий підхід акцентує увагу на читабельності, зберігаючи елегантність функцій.

Розгляньмо різницю між традиційним та флент-підходом:

Традиційна логіка умов:

$config = Fluent::make([
    'app_name' => 'TaskManager',
    'debug_mode' => true,
    'features' => 12,
]);
 
if (auth()->isPremium()) {
    $config = $config->set('tier', 'premium');
} else {
    $config = $config->forget('features');
}

Флент-логіка умов:

$config = Fluent::make([
    'app_name' => 'TaskManager',
    'debug_mode' => true,
    'features' => 12,
])->when(auth()->isPremium(), function (Fluent $input) {
    return $input->set('tier', 'premium');
})->unless(auth()->isPremium(), function (Fluent $input) {
    return $input->forget('features');
});

Флент-підхід зберігає логіку виконання, не перериваючи ланцюг методів. Він звучить природно: "Створити об'єкт Fluent з цими властивостями; якщо користувач преміум, додати преміум-тариф; якщо ні — прибрати кількість функцій."

Цей підхід особливо цінний при підготовці складних структур даних:

use Illuminate\Support\Fluent;
 
class ProductResource
{
    public function toArray($request)
    {
        $product = $this->resource;
 
        return Fluent::make([
            'id' => $product->id,
            'name' => $product->name,
            'price' => $product->price,
            'available_since' => $product->created_at->toDateString(),
        ])
            ->when($request->user()->can('view-analytics'), function (Fluent $data) use ($product) {
                return $data->set('view_count', $product->views()->count())
                            ->set('purchase_count', $product->orders()->count());
            })
            ->when($product->isOnSale(), function (Fluent $data) use ($product) {
                return $data->set('sale_price', $product->sale_price)
                            ->set('discount_percentage', $product->discount_rate);
            })
            ->unless($request->includesSensitiveData(), function (Fluent $data) {
                return $data->forget('cost_price')
                            ->forget('supplier_info');
            })
            ->when($product->hasReviews(), function (Fluent $data) use ($product) {
                return $data->set('average_rating', $product->averageRating())
                            ->set('review_count', $product->reviews()->count());
            })
            ->toArray();
    }
}

Такий підхід дає змогу умовно формувати дані відповіді залежно від прав доступу, стану продукту та параметрів запиту, зберігаючи логіку та читаємість коду. Кожна умова ясно передає своє призначення, не перериваючи логічну послідовність виконання.

Trait Conditionable спрощує складну умовну логіку, перетворюючи її на зрозумілий і підтримуваний код, що чітко передає намір і зменшує когнітивне навантаження на розробників, які читають та підтримують кодову базу