클래스에서 빌더 패턴을 생성하는 PHP 독립형 라이브러리입니다.
프로젝트에서 또는 전 세계적으로 작곡가를 사용하여
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는 빌더 클래스의 종속성으로 사용됩니다.
클래스를 구축하는 데에는 공용 속성, 설정자(유창하든 아니든), 생성자 등 다양한 전략이 있습니다. 각 전략에 대한 간략한 설명은 아래에 나와 있지만, 이를 완전히 이해하려면 단위 테스트를 읽는 것이 더 나을 수도 있습니다.
기본적으로 생성기는 빌드된 클래스 내에서 가장 많이 사용되는 전략을 감지하고 이를 전체 빌더 클래스에 사용합니다. 하나를 제외한 모든 속성에 대해 setter를 사용하는 경우 생성기는 이를 지원하는 속성에 대해 setter를 사용하고 지원하지 않는 속성은 무시합니다.
하지만 '--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/configuring-third-party-tools.html을 참조하세요. 구성 예: