マルチテナント SaaS でのチームスコープ
個人ユーザーではなくチーム(テナント)単位でフラグを管理したい場合は、デフォルトスコープをチームに変更します。Feature::active('billing-v2') が自動的に現在のチームを対象にします。チームメンバーが誰であっても同じチームに属する限り同じ結果が返るため、UI の一貫性が保たれます。
チームのサインアップ日に応じた段階的ロールアウトの例です。
緊急キルスイッチ(before メソッドの活用)
本番でバグが発覚したとき、コードロールバックなしで即座に機能を無効化できます。クラスベースのフィーチャーに before メソッドを追加すると、ストレージの値より先にチェックが走ります。
FEATURES_NEW_CHECKOUT_DISABLED=true を設定するだけで、DBを触らずに機能を止められます。デプロイ不要のキルスイッチです。
スケジュールされたロールアウト
特定日時に自動的に全ユーザーへ公開したいケース。before メソッドで実装できます。
2025-04-01 を過ぎると自動的に全ユーザーに公開されます。デプロイなし、DBなし、Artisanコマンドなしで自動化できます。
ダークローンチ(Shadow Mode)
新しいロジックをユーザーに見せずに本番データで動かし、旧ロジックと結果を比較するパターンです。問題がなければフラグをオンにするだけでリリース完了です。recommendation-v2 に切り替えるだけです。
イベントを使った A/B テスト結果の収集
公式ドキュメントにはFeatureRetrieved イベントの言及はありますが、実際のA/Bテスト集計パターンは示されていません。
FeatureResolved イベントはフィーチャーの値が初めて解決されたときのみ発火します。これを使ってユーザーのバリアント割り当てを記録します。
FeatureResolved と FeatureRetrieved の違い: FeatureResolved は初回評価時のみ発火、FeatureRetrieved は毎回のチェックで発火します。割り当て記録には FeatureResolved、ページビュー追跡には FeatureRetrieved が適しています。キューイングされたジョブでのスコープ
キューのジョブでは認証済みユーザーが存在しないため、フィーチャーチェックが想定外の挙動をすることがあります。ジョブにスコープを明示的に持たせましょう。Artisan コマンドによる管理 UI
フラグを管理する簡単な Artisan コマンドを作れば、デプロイなしで本番フラグを操作できます。フィーチャー名の安全なリファクタリング(Name アトリビュート)
クラスベースのフィーチャーをリネームする際、DBに保存済みのフラグ名が変わると全ユーザーのフラグがリセットされてしまいます。Name アトリビュートで保存名を固定しましょう。
まとめ
公式ドキュメントの基本を押さえたら、以下のパターンで Pennant の真価が発揮されます。Laravel Pennant ガイド
インストールから基本的な使い方まではガイドページを参照してください。