Прапорець функції (feature flag) - перемикач, який вмикає чи вимикає частину функціональності без деплою. Код нової можливості вже на продакшені, але бачать її лише ті, кому прапорець увімкнено.
Навіщо це потрібно:
- поступовий запуск: спершу 5% користувачів, потім 50%, потім усі;
- trunk-based розробка: незавершену функцію можна зливати в
main, бо вона прихована прапорцем; - швидкий «вимикач»: якщо нова функція ламає продакшен, її вимикають без відкату коду;
- A/B-тести й бета-доступ для окремих клієнтів.
Laravel Pennant - офіційний пакет для прапорців. Прапорець оголошують у сервіс-провайдері:
use App\Models\User;
use Illuminate\Support\Lottery;
use Laravel\Pennant\Feature;
Feature::define('new-checkout', fn (User $user) => match (true) {
$user->isInternal() => true,
$user->isHighTrafficCustomer() => false,
default => Lottery::odds(1 / 10),
});
Замикання отримує скоп - за замовчуванням автентифікованого користувача - і повертає результат.
Перевірка в коді й шаблонах:
if (Feature::active('new-checkout')) {
return $this->newCheckout($request);
}
@feature('new-checkout')
<x-checkout.new />
@else
<x-checkout.legacy />
@endfeature
Для маршрутів є middleware EnsureFeaturesAreActive, що повертає помилку, якщо прапорець вимкнено.
Важлива деталь: драйвер за замовчуванням - database. Pennant зберігає обчислене значення в таблиці features, тож користувач, якому одного разу «випало» true в лотереї, і далі бачитиме нову версію. Це робить досвід стабільним, але означає, що зміна визначення не впливає на вже збережені значення.
Чого не робити: не залишати прапорці назавжди. Кожен прапорець - це дві гілки коду, які треба підтримувати й тестувати. Після повного запуску прапорець і стара гілка видаляються.