Skip to main content
基本的な使い方はガイドページを参照してください。このページでは公式ドキュメントには載っていない実践的なパターンを紹介します。

マルチテナント SaaS でのチームスコープ

個人ユーザーではなくチーム(テナント)単位でフラグを管理したい場合は、デフォルトスコープをチームに変更します。
これだけで Feature::active('billing-v2') が自動的に現在のチームを対象にします。チームメンバーが誰であっても同じチームに属する限り同じ結果が返るため、UI の一貫性が保たれます。 チームのサインアップ日に応じた段階的ロールアウトの例です。
特定チームのみ有効化したい場合(エンタープライズ顧客への先行提供など):

緊急キルスイッチ(before メソッドの活用)

本番でバグが発覚したとき、コードロールバックなしで即座に機能を無効化できます。クラスベースのフィーチャーに before メソッドを追加すると、ストレージの値より先にチェックが走ります。
環境変数 FEATURES_NEW_CHECKOUT_DISABLED=true を設定するだけで、DBを触らずに機能を止められます。デプロイ不要のキルスイッチです。
beforenull を返すと resolve() が実行されます。false を返すと即座に非アクティブとして扱われます。緊急時以外は null を返しておきましょう。

スケジュールされたロールアウト

特定日時に自動的に全ユーザーへ公開したいケース。before メソッドで実装できます。
これで 2025-04-01 を過ぎると自動的に全ユーザーに公開されます。デプロイなし、DBなし、Artisanコマンドなしで自動化できます。

ダークローンチ(Shadow Mode)

新しいロジックをユーザーに見せずに本番データで動かし、旧ロジックと結果を比較するパターンです。問題がなければフラグをオンにするだけでリリース完了です。
ログを確認して差異がなくなったら、フラグを recommendation-v2 に切り替えるだけです。

イベントを使った A/B テスト結果の収集

公式ドキュメントには FeatureRetrieved イベントの言及はありますが、実際のA/Bテスト集計パターンは示されていません。 FeatureResolved イベントはフィーチャーの値が初めて解決されたときのみ発火します。これを使ってユーザーのバリアント割り当てを記録します。
コンバージョン発生時に別途記録すれば、バリアントごとのコンバージョン率を集計できます。
FeatureResolvedFeatureRetrieved の違い: FeatureResolved は初回評価時のみ発火、FeatureRetrieved は毎回のチェックで発火します。割り当て記録には FeatureResolved、ページビュー追跡には FeatureRetrieved が適しています。

キューイングされたジョブでのスコープ

キューのジョブでは認証済みユーザーが存在しないため、フィーチャーチェックが想定外の挙動をすることがあります。ジョブにスコープを明示的に持たせましょう。
ジョブのディスパッチ時にフラグを評価してジョブに渡す方法もあります。

Artisan コマンドによる管理 UI

フラグを管理する簡単な Artisan コマンドを作れば、デプロイなしで本番フラグを操作できます。

フィーチャー名の安全なリファクタリング(Name アトリビュート)

クラスベースのフィーチャーをリネームする際、DBに保存済みのフラグ名が変わると全ユーザーのフラグがリセットされてしまいます。Name アトリビュートで保存名を固定しましょう。
これでクラス名を自由にリファクタリングしても、DBのデータはそのまま維持されます。

まとめ

公式ドキュメントの基本を押さえたら、以下のパターンで Pennant の真価が発揮されます。

Laravel Pennant ガイド

インストールから基本的な使い方まではガイドページを参照してください。
最終更新日 2026年5月19日