Skip to main content

Laravel Pennantとは

Laravel Pennant は、シンプルで軽量な機能フラグ(Feature Flag)パッケージです。機能フラグを使うと、新機能を段階的にロールアウトしたり、A/Bテストを実施したり、トランクベース開発を補完したりできます。

機能フラグとは

機能フラグを使うことで、コードのデプロイとリリースを分離できます。コードは本番環境にデプロイしておきながら、機能のON/OFFを設定で制御できます。

インストール

1

パッケージのインストール

Composerを使ってPennantをインストールします。
2

設定ファイルとマイグレーションの公開

vendor:publish Artisanコマンドでファイルを公開します。
これにより config/pennant.phpdatabase/migrations にマイグレーションファイルが生成されます。
3

マイグレーションの実行

Pennantがフィーチャーフラグの値を保存する features テーブルを作成します。

設定

config/pennant.php で使用するストレージドライバーを設定できます。Pennantは2種類のドライバーをサポートしています。

フィーチャーの定義

クロージャーベースの定義

フィーチャーは Feature ファサードの define メソッドで定義します。通常はサービスプロバイダーの boot メソッドで定義します。クロージャーには「スコープ」(通常は認証済みユーザー)が渡されます。
このフィーチャーのロジックは以下の通りです。
  • 社内チームメンバーは必ずON
  • 高トラフィック顧客はOFF
  • それ以外は1%の確率でON
フィーチャーが初めてチェックされたとき、クロージャーの結果がストレージドライバーに保存されます。次回以降は保存された値が使われます。
定義がLotteryを返すだけの場合、クロージャーを省略できます。

クラスベースの定義

Pennantはクラスベースのフィーチャー定義もサポートしています。クラスベースの場合、サービスプロバイダーへの登録は不要です。
生成されたクラスは app/Features ディレクトリに配置されます。resolve メソッドを実装するだけです。

保存名のカスタマイズ

デフォルトでは完全修飾クラス名が保存されます。Name アトリビュートで名前をカスタマイズできます。

フィーチャーチェックの傍受 (before メソッド)

クラスベースのフィーチャーには before メソッドを定義できます。このメソッドはストレージから値を取得する前にインメモリで実行され、null 以外の値を返すとその値が使われます。
before メソッドはバグ発生時に機能を緊急無効化したり、特定日時にロールアウトをスケジュールしたりする際に役立ちます。

フィーチャーの確認

Feature::active() / Feature::inactive()

active メソッドでフィーチャーがアクティブかどうかを確認できます。デフォルトでは現在認証済みのユーザーに対してチェックが行われます。
クラスベースのフィーチャーの場合はクラス名を渡します。
その他の便利なメソッドも用意されています。

条件付き実行 (when / unless)

when メソッドを使うと、フィーチャーがアクティブな場合のみクロージャーを実行できます。
unlesswhen の逆で、フィーチャーが非アクティブな場合に最初のクロージャーを実行します。

HasFeatures トレイト

HasFeatures トレイトを User モデルに追加すると、モデルから直接フィーチャーをチェックできます。

Bladeディレクティブ

Bladeテンプレートでは @feature ディレクティブを使えます。

ミドルウェア

EnsureFeaturesAreActive ミドルウェアを使うと、ルートへのアクセスにフィーチャーが必要であることを指定できます。フィーチャーが非アクティブな場合は 400 Bad Request が返されます。
レスポンスをカスタマイズするには whenInactive メソッドを使います。

インメモリキャッシュ

Pennantは1リクエスト内でフィーチャーの結果をインメモリにキャッシュします。同じフィーチャーフラグを複数回チェックしても追加のDBクエリは発生しません。 キャッシュを手動でクリアするには flushCache メソッドを使います。

スコープ

スコープの指定

デフォルトでは認証済みユーザーがスコープになりますが、for メソッドで任意のスコープを指定できます。
チームごとにフィーチャーを管理する例です。

デフォルトスコープのカスタマイズ

Feature::resolveScopeUsing でデフォルトスコープをカスタマイズできます。
設定後は for を省略するとデフォルトスコープが使われます。

Nullable Scope

スコープが null の場合(未認証ルート、Artisanコマンドなど)、フィーチャー定義がnullに対応していないと自動的に false が返されます。nullを扱う場合はnullable型で定義してください。

リッチフィーチャー値

フィーチャーはboolean以外の値も返せます。例えばA/Bテストでボタンの色を制御する場合です。
値を取得するには value メソッドを使います。
Bladeでは値を使った条件分岐もできます。
リッチ値を使う場合、false 以外のすべての値がアクティブとみなされます。
when メソッドにリッチ値が渡される場合、最初のクロージャーに値が渡されます。

複数フィーチャーの取得

values メソッドで複数のフィーチャーの値を一度に取得できます。
all メソッドで定義済みのすべてのフィーチャーの値を取得できます。
クラスベースのフィーチャーを all の結果に含めるには、サービスプロバイダーで discover を呼び出します。
これにより app/Features ディレクトリのすべてのフィーチャークラスが登録されます。

Eager Loading

ループ内でフィーチャーチェックを行う場合、パフォーマンスの問題が発生することがあります。load メソッドを使って事前に値を取得しておくことで解決できます。
未取得の値のみを取得するには loadMissing を使います。

値の更新

手動での更新

activate / deactivate メソッドでフィーチャーのON/OFFを切り替えられます。
保存された値を忘れさせるには forget メソッドを使います。次回チェック時に定義から再評価されます。

一括更新

activateForEveryone / deactivateForEveryone でストレージ内のすべてのスコープに一括適用できます。

フィーチャーのパージ

フィーチャーをアプリケーションから削除した場合や定義を変更した場合、ストレージから値を削除(パージ)できます。
Artisanコマンドでもパージできます。デプロイパイプラインに組み込むと便利です。

テスト

フィーチャーの再定義

テストでは Feature::define でフィーチャーを再定義することで、返り値を制御できます。
tab=Pest
tab=PHPUnit
クラスベースのフィーチャーも同様に扱えます。
tab=Pest
tab=PHPUnit

テスト用ストアの設定

テスト中に使用するストアを phpunit.xml の環境変数で指定できます。

カスタムドライバー

既存のドライバーが要件に合わない場合、カスタムドライバーを作成できます。Laravel\Pennant\Contracts\Driver インターフェースを実装します。
サービスプロバイダーの boot メソッドで extend を呼び出して登録します。
登録後は config/pennant.php でドライバーを指定できます。

まとめ

次のステップ

デバッグとエラーハンドリング

アプリケーションの例外処理とレポートの仕組みを学びます。

Laravel Pulse

アプリケーションのパフォーマンス監視ダッシュボードを導入します。
最終更新日 2026年5月19日