用於從類別生成建構器模式的 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 ());
}
建構器類別可能需要接收有關程式碼樣式、faker 用法、推斷類型、命名空間等的更新。您的 IDE 應該能夠輕鬆解決所有問題。
生成器將嘗試偵測屬性類型(php 類型、phpdoc 類型、學說 orm 屬性或註解),並嘗試根據屬性的類型和名稱檢測適當的 faker 方法。
您可以使用 --faker 選項嘗試設定最相關的值。在這種情況下,Faker 將用作建構器類別的依賴項。
建構類別的策略有很多:公共屬性、setter(流暢或不流暢)、建構子。下面給出了每種策略的簡要說明,但您可能更喜歡閱讀單元測試以完全理解它們。
預設情況下,生成器將嘗試偵測建置類別中最常用的策略,並將其用於整個建構器類別。如果您在除一個屬性之外的所有屬性上使用 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。設定範例: