Скоп - сутність, для якої обчислюється прапорець. За замовчуванням це автентифікований користувач, але скопом може бути будь-що: команда, організація, тенант.
Перевірка для конкретного скопу:
Feature::for($user->team)->active('billing-v2');
Визначення з урахуванням скопу:
use App\Models\Team;
Feature::define('billing-v2', function (Team $team) {
if ($team->created_at->isAfter('2026-01-01')) {
return true; // нові команди одразу на новому білінгу
}
return Lottery::odds(1 / 100); // старі - поступово
});
Чому це важливо: якщо функція змінює спільні дані команди (білінг, налаштування), прапорець на рівні користувача дасть різну поведінку для колег з однієї команди. Скоп має відповідати межі, в якій функція має бути узгодженою.
Скоп за замовчуванням можна змінити, щоб не писати for() щоразу:
Feature::resolveScopeUsing(fn ($driver) => Auth::user()?->team);
Багатші значення - прапорець може повертати не лише булеве значення:
Feature::define('purchase-button', fn (User $user) => Arr::random([
'blue-sapphire',
'seafoam-green',
'tart-orange',
]));
$color = Feature::value('purchase-button');
@feature('purchase-button', 'seafoam-green')
<!-- варіант B -->
@endfeature
Так роблять A/B-тести: кожен користувач стабільно отримує свій варіант (значення зберігається), а аналітика порівнює конверсію.
Керування вручну:
Feature::for($team)->activate('billing-v2');
Feature::deactivate('billing-v2'); // для поточного скопу
Feature::activateForEveryone('billing-v2'); // оновити всі збережені значення
Гостьовий скоп: якщо користувач не автентифікований, скоп - null. Визначення має приймати nullable-тип (?User $user), інакше Pennant поверне false, не викликаючи замикання.