ไลบรารี 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 จะถูกนำมาใช้เป็นการพึ่งพาคลาสผู้สร้าง
มีกลยุทธ์มากมายในการสร้างคลาส: ทรัพย์สินสาธารณะ, ผู้ตั้งค่า (คล่องแคล่วหรือไม่), ตัวสร้าง คำอธิบายโดยย่อเกี่ยวกับแต่ละกลยุทธ์มีระบุไว้ด้านล่าง แต่คุณอาจต้องการอ่านการทดสอบหน่วยเพื่อทำความเข้าใจอย่างถ่องแท้
ตามค่าเริ่มต้น ตัวสร้างจะพยายามตรวจจับกลยุทธ์ที่ใช้มากที่สุดภายในคลาสที่สร้างขึ้น และจะใช้มันสำหรับคลาสตัวสร้างทั้งหมด หากคุณใช้ setters บนคุณสมบัติทั้งหมดยกเว้นคุณสมบัติเดียว ตัวสร้างจะใช้ setters บนคุณสมบัติที่รองรับและละเว้นคุณสมบัติที่ไม่รองรับ
แต่คุณยังสามารถส่งผ่านกลยุทธ์ได้อย่างชัดเจนโดยใช้ตัวเลือก '--กลยุทธ์'
เมื่อทรัพย์สินเป็นที่สาธารณะ ดูตัวอย่างด้านบน
เมื่อคุณสมบัติได้รับการป้องกัน/ส่วนตัว และตั้งค่าภายในวิธีการ __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 ไว้ในสถานะใดสถานะหนึ่ง เพื่อวัตถุประสงค์ในการทดสอบ หากคุณต้องการตั้งค่าสถานะของคุณสมบัติอ็อบเจ็กต์ตามคุณสมบัติได้อย่างรวดเร็ว วิธีแก้ไขคือเพิ่มเมธอด static 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 การกำหนดค่าตัวอย่าง: