クラスからビルダー パターンを生成するための PHP スタンドアロン ライブラリ。
プロジェクトまたはグローバルで Composer を使用する
composer require natitech/builder-generator
composer global require natitech/builder-generator
バイナリを使用して、クラスの近くにビルダーを生成できます。
/path/to/vendor/bin/generate-builder /path/to/class
または、別の PHP スクリプト内で使用することもできます。
Nati BuilderGenerator FileBuilderGenerator:: create ()-> generateFrom ( ' /path/to/class ' );
これにより、ビルドされたクラスとは別にビルダー クラスが生成されます。
例 :
//From /path/to/MyClass.php file = the built class
class MyClass {
public int $ id ;
public string $ label ;
}
//This new file /path/to/MyClassBuilder.php will be generated = the builder class
class MyClassBuilder {
private int $ id ;
private string $ label ;
public function __construct ( Faker $ faker )
{
$ this -> id = $ faker -> number ();
$ this -> label = $ faker -> word ;
}
public function build (): MyClass
{
$ myClass = new MyClass ();
$ myClass -> id = $ this -> id ;
$ myClass -> label = $ this -> label ;
return $ myClass ;
}
//this will have to be generated by your IDE
public function withLabel ( string $ label ): self
{
$ this -> label = $ label ;
return $ this ;
}
}
//The ultimate goal is to use this in tests
/** @test */
public function canTestSomething ()
{
$ this -> assertEquals (
' test ' ,
$ this -> service -> something ( $ this -> myClass ()-> withLabel ( ' used in test ' )-> build ())
);
}
private function myClass (): MyClassBuilder
{
return new MyClassBuilder ( Faker Factory:: create ());
}
ビルダー クラスは、コードスタイル、偽装の使用法、推論された型、名前空間などに関する更新を受信する必要がある場合があります。また、未使用のコードの生成を避けるために、ビルダー プロパティのセッターはありません。 IDE はこれらすべてを簡単に修正できるはずです。
ジェネレーターはプロパティ タイプ (php タイプ、phpdoc タイプ、ドクトリン orm 属性またはアノテーション) を検出しようとし、プロパティのタイプと名前に基づいて適切な Faker メソッドを検出しようとします。
--faker オプションを使用すると、最も関連性の高い値の設定を試みることができます。その場合、Faker はビルダー クラスの依存関係として使用されます。
クラスを構築するには、パブリック プロパティ、セッター (流暢かどうかに関係なく)、コンストラクターなど、多くの戦略があります。各戦略の簡単な説明を以下に示しますが、完全に理解するには単体テストを読むことをお勧めします。
デフォルトでは、ジェネレーターはビルドされたクラス内で最も使用されている戦略を検出しようとし、それをビルダー クラス全体に使用します。 1 つを除くすべてのプロパティでセッターを使用している場合、ジェネレーターはそれをサポートするプロパティでセッターを使用し、サポートしないプロパティは無視します。
ただし、「--strategy」オプションを使用して戦略を明示的に渡すこともできます。
プロパティが公開されている場合。上の例を参照してください。
プロパティが保護/プライベートであり、__construct メソッド内で設定されている場合。
//Built class
class MyClass {
private int $ id ;
public function __construct ( int $ id , private string $ label )
{
$ this -> id = $ id ;
}
}
//Builder class
class MyClassBuilder {
private int $ id ;
private string $ label ;
public function __construct ( Faker $ faker )
{
$ this -> id = $ faker -> number ();
$ this -> label = $ faker -> word ;
}
public function build (): MyClass
{
return new MyClass (
$ this -> id ,
$ this -> label
);
}
}
プロパティが保護/プライベートであるが、パブリック セッターを使用して設定できる場合。セッターは流暢であってもそうでなくても構いません。
//Built class
class MyClass {
protected int $ id ;
protected string $ label ;
public function setId ( int $ id )
{
$ this -> id = $ id ;
return $ this ;
}
public function setLabel ( string $ label )
{
$ this -> label = $ label ;
return $ this ;
}
}
//Builder class
class MyClassBuilder {
private int $ id ;
private string $ label ;
public function __construct ( Faker $ faker )
{
$ this -> id = $ faker -> number ();
$ this -> label = $ faker -> word ;
}
public function build (): MyClass
{
return ( new MyClass ())
-> setId ( $ this -> id )
-> setLabel ( $ this -> label );
}
}
これは、あまり一般的ではないクラス構築方法です。その場合、プロパティは保護/プライベートとなり、パブリック ドメイン メソッドによって設定されます。したがって、構築されたクラスを特定の状態に設定する簡単な方法はありません。テスト目的で、そのオブジェクトのプロパティの状態をプロパティごとにすばやく設定できるようにしたい場合、解決策は、ビルドされたクラスに静的な build() メソッドを追加することです。
//Built class
class MyClass {
private int $ id ;
private ? string $ label = null ;
public static function create ( int $ id ): self
{
$ myClass = new self ();
$ myClass -> id = $ id ;
return $ myClass ;
}
public function updateLabel ( string $ label ): self
{
$ this -> label = $ label ;
return $ this ;
}
//This method will have to be generated by you IDE from the builder class
//It allows you to hack the state of this object without relying on its public interface
public static function build ( int $ id , string $ label ): self
{
$ myClass = new self ();
$ myClass -> id = $ this -> id ;
$ myClass -> label = $ this -> label ;
return $ myClass ;
}
}
//Builder class
class MyClassBuilder {
private int $ id ;
private string $ label ;
public function __construct ( Faker $ faker )
{
$ this -> id = $ faker -> number ();
$ this -> label = $ faker -> word ;
}
public function build (): MyClass
{
return MyClass:: build (
$ this -> id ,
$ this -> label
);
}
}
カスタム戦略を作成するには:
NatiBuilderGeneratorPropertyPropertyBuildStrategy
を実装し、それをNatiBuilderGeneratorPropertyPropertyBuildStrategyCollection
に追加する必要があります。これにより、プロパティがどのように構築されるかが決まります。NatiBuilderGeneratorAnalyzerBuildableClassAnalyzer::getWriteStrategies()
を完了する必要もあります。これにより、この戦略で物件をいつ建設できるかが決まります。 このツールは IDE の外部ツールとして使用できます。
PHPStorm ユーザーについては、https://www.jetbrains.com/help/phpstorm/cconfiguring-third-party-tools.html を参照してください。構成例: