مكتبة 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، أو سمات التعليم أو التعليقات التوضيحية) وسيحاول اكتشاف طريقة التزييف المناسبة بناءً على نوع الخصائص واسمها.
يمكنك استخدام خيار --faker لمحاولة تعيين القيم الأكثر صلة. في هذه الحالة، سيتم استخدام Faker باعتباره تبعية لفئة المنشئ.
هناك العديد من الاستراتيجيات لبناء فئة: الخصائص العامة، واضع (سواء كان بطلاقة أم لا)، منشئ. ويرد أدناه شرح موجز لكل استراتيجية، ولكن قد تفضل قراءة اختبارات الوحدة لفهمها بشكل كامل.
افتراضيًا، سيحاول المولد اكتشاف الإستراتيجية الأكثر استخدامًا داخل الفئة المبنية وسيستخدمها لفئة المنشئ بأكملها. إذا كنت تستخدم أدوات ضبط على جميع الخصائص باستثناء واحدة، فسيستخدم المولد أدوات ضبط على الخصائص التي تدعمه ويتجاهل الخاصية التي لا تدعمه.
ولكن يمكنك أيضًا تمرير إستراتيجية بشكل صريح باستخدام خيار "--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 );
}
}هذه طريقة أقل تقليدية لبناء الفصل. في هذه الحالة، تكون الخصائص محمية/خاصة ويتم تعيينها بواسطة طرق المجال العام. لذلك، لا توجد طريقة سهلة لتعيين الطبقة المبنية في حالة معينة. إذا كنت تريد، لأغراض الاختبار، أن تكون قادرًا على تعيين حالة خصائص الكائن بسرعة حسب الخصائص، فإن الحل هو إضافة طريقة بناء ثابتة () في الفئة المبنية.
//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. تكوين المثال :