Laravel Pennantとは
Laravel Pennant は、シンプルで軽量な機能フラグ(Feature Flag)パッケージです。機能フラグを使うと、新機能を段階的にロールアウトしたり、A/Bテストを実施したり、トランクベース開発を補完したりできます。機能フラグとは
機能フラグを使うことで、コードのデプロイとリリースを分離できます。コードは本番環境にデプロイしておきながら、機能のON/OFFを設定で制御できます。インストール
1
パッケージのインストール
Composerを使ってPennantをインストールします。
2
設定ファイルとマイグレーションの公開
vendor:publish Artisanコマンドでファイルを公開します。config/pennant.php と database/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 以外の値を返すとその値が使われます。
フィーチャーの確認
Feature::active() / Feature::inactive()
active メソッドでフィーチャーがアクティブかどうかを確認できます。デフォルトでは現在認証済みのユーザーに対してチェックが行われます。
条件付き実行 (when / unless)
when メソッドを使うと、フィーチャーがアクティブな場合のみクロージャーを実行できます。
unless は when の逆で、フィーチャーが非アクティブな場合に最初のクロージャーを実行します。
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 メソッドを使います。
リッチ値を使う場合、
false 以外のすべての値がアクティブとみなされます。when メソッドにリッチ値が渡される場合、最初のクロージャーに値が渡されます。
複数フィーチャーの取得
values メソッドで複数のフィーチャーの値を一度に取得できます。
all メソッドで定義済みのすべてのフィーチャーの値を取得できます。
all の結果に含めるには、サービスプロバイダーで discover を呼び出します。
app/Features ディレクトリのすべてのフィーチャークラスが登録されます。
Eager Loading
ループ内でフィーチャーチェックを行う場合、パフォーマンスの問題が発生することがあります。load メソッドを使って事前に値を取得しておくことで解決できます。
loadMissing を使います。
値の更新
手動での更新
activate / deactivate メソッドでフィーチャーのON/OFFを切り替えられます。
forget メソッドを使います。次回チェック時に定義から再評価されます。
一括更新
activateForEveryone / deactivateForEveryone でストレージ内のすべてのスコープに一括適用できます。
フィーチャーのパージ
フィーチャーをアプリケーションから削除した場合や定義を変更した場合、ストレージから値を削除(パージ)できます。テスト
フィーチャーの再定義
テストではFeature::define でフィーチャーを再定義することで、返り値を制御できます。
tab=Pest
tab=PHPUnit
tab=Pest
tab=PHPUnit
テスト用ストアの設定
テスト中に使用するストアをphpunit.xml の環境変数で指定できます。
カスタムドライバー
既存のドライバーが要件に合わない場合、カスタムドライバーを作成できます。Laravel\Pennant\Contracts\Driver インターフェースを実装します。
boot メソッドで extend を呼び出して登録します。
config/pennant.php でドライバーを指定できます。
まとめ
次のステップ
デバッグとエラーハンドリング
アプリケーションの例外処理とレポートの仕組みを学びます。
Laravel Pulse
アプリケーションのパフォーマンス監視ダッシュボードを導入します。