Pustaka mandiri PHP untuk menghasilkan pola pembangun dari suatu kelas.
Dengan menggunakan komposer pada proyek Anda atau secara global
composer require natitech/builder-generator
composer global require natitech/builder-generator
Anda dapat menggunakan biner untuk menghasilkan pembangun di dekat kelas:
/path/to/vendor/bin/generate-builder /path/to/class
ATAU Anda dapat menggunakannya di dalam skrip PHP lain:
Nati BuilderGenerator FileBuilderGenerator:: create ()-> generateFrom ( ' /path/to/class ' );
Ini akan menghasilkan kelas pembangun selain kelas yang dibangun.
Contoh :
//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 ());
}
Kelas pembuat mungkin perlu menerima pembaruan pada gaya kode, penggunaan palsu, tipe yang disimpulkan, namespace, dll. Selain itu, untuk menghindari pembuatan kode yang tidak digunakan, tidak ada penyetel untuk properti pembuat. IDE Anda seharusnya dapat memperbaiki semua itu dengan mudah.
Generator akan mencoba mendeteksi tipe properti (tipe php, tipe phpdoc, atribut doktrin atau anotasi) dan akan mencoba mendeteksi metode pemalsu yang sesuai berdasarkan tipe dan nama properti.
Anda dapat menggunakan opsi --faker untuk mencoba menetapkan nilai yang paling relevan. Dalam hal ini, Faker akan digunakan sebagai dependensi dari kelas pembangun.
Ada banyak strategi untuk membangun sebuah kelas: properti publik, setter (lancar atau tidak), konstruktor. Penjelasan singkat tentang masing-masing strategi diberikan di bawah ini, namun Anda mungkin lebih suka membaca pengujian unit untuk memahaminya sepenuhnya.
Secara default, generator akan mencoba mendeteksi strategi yang paling sering digunakan di dalam kelas yang dibangun dan akan menggunakannya untuk seluruh kelas pembangun. Jika Anda menggunakan setter pada semua properti kecuali satu properti, generator akan menggunakan setter pada properti yang mendukungnya dan mengabaikan properti yang tidak mendukungnya.
Namun Anda juga dapat secara jelas memberikan strategi menggunakan opsi '--strategy'.
Ketika properti bersifat publik. Lihat contoh di atas.
Ketika properti dilindungi/pribadi dan diatur di dalam metode __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
);
}
}
Ketika properti dilindungi/pribadi tetapi dapat diatur menggunakan penyetel publik. Setternya bisa fasih atau tidak.
//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 );
}
}
Ini adalah cara yang tidak terlalu konvensional untuk membangun kelas. Dalam hal ini, properti dilindungi/pribadi dan ditetapkan oleh metode domain publik. Jadi, tidak ada cara mudah untuk mengatur kelas yang dibangun dalam keadaan tertentu. Jika, untuk tujuan pengujian, Anda ingin dapat dengan cepat mengatur status properti objek berdasarkan properti, solusinya adalah dengan menambahkan metode build() statis di kelas yang dibangun.
//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
);
}
}
Untuk membuat strategi khusus:
NatiBuilderGeneratorPropertyPropertyBuildStrategy
dan menambahkannya ke NatiBuilderGeneratorPropertyPropertyBuildStrategyCollection
. Ini akan menentukan BAGAIMANA properti dibangun.NatiBuilderGeneratorAnalyzerBuildableClassAnalyzer::getWriteStrategies()
. Hal ini akan menentukan KAPAN properti dapat dibangun dengan strategi ini. Anda dapat menggunakan alat ini sebagai alat eksternal di IDE Anda.
Untuk pengguna PHPStorm, lihat https://www.jetbrains.com/help/phpstorm/configuring-third-party-tools.html. Contoh konfigurasi: