แพ็คเกจนี้ช่วยให้คุณสามารถสร้างคลาส DTO ที่สะอาดและเป็นอิสระ (เรียกอีกอย่างว่า "วัตถุค่า") โดยสคีมาที่ประกาศสั้น ๆ ในรหัส PHP
คุณต้องการแพ็คเกจนี้ในสภาพแวดล้อมการพัฒนาเนื่องจากคลาสที่สร้างขึ้นไม่ได้ใช้อะไรจากรหัสของห้องสมุดนี้ นั่นคือเหตุผลที่วิธีที่ต้องการคือการรวมมันเป็น require-dev :
$ composer require --dev klkvsk/dto-generator
Schema เป็นไฟล์ PHP ปกติทุกที่ในโครงการของคุณ ไฟล์ควรส่งคืนวัตถุ Schema มาจากระดับบนสุด
ตัวอย่างสคีมา:
<?php
use Klkvsk DtoGenerator Schema as dto ;
use Klkvsk DtoGenerator Schema Types as t ;
return dto schema (
namespace: ' MyProjectData ' ,
objects: [
new dto object (
name: ' Person ' ,
fields: [
dto field ( ' name ' , t string (), required: true ),
dto field ( ' age ' , t int (), required: true ),
]
),
]
); การสร้างรหัสทำด้วยคำสั่ง dto-gen :
$ ./vendor/bin/dto-gen [schema-file]
โดยค่าเริ่มต้นเครื่องกำเนิดไฟฟ้าจะค้นหาไฟล์ที่มีชื่อหรือสิ้นสุดด้วย dto.schema.php แต่คุณสามารถให้ไฟล์สคีมาเป็นอาร์กิวเมนต์ด้วยตนเอง
เครื่องกำเนิดไฟฟ้าจะพยายามเดาเส้นทางที่เหมาะสมสำหรับเอาต์พุตโดยดูที่เส้นทาง autoload ใน Composer.json หากระบุการแมป PSR-4 สำหรับ "MyProject\": "src/" ไฟล์ด้านบนจะถูกวางไว้ใน src/Data/Person.php
ในการแทนที่พฤติกรรมนี้คุณสามารถระบุ outputDir ได้โดยตรง:
dto schema (namespace: " MyProject \ Data " , outputDir: " src/generated/ " , ...);ในการสร้างรหัสที่กำหนดเป้าหมาย PHP รุ่นน้อยที่สุดให้ใช้:
./vendor/bin/dto-gen --target 7.4
ตัวเลือกนี้เปิดใช้งานหรือปิดใช้งานคุณสมบัติภาษาที่ใหม่กว่าในรหัสผลลัพธ์
เป็นไปได้ที่จะสร้าง DTOs ไม่เพียง แต่ยังเกี่ยวข้องกับ enums ด้วย:
dto schema(
objects: [
dto enum (
name: ' PostStatus '
cases: [ ' draft ' , ' published ' , ' deleted ' ]
),
dto object(
name: ' Post ' ,
fields: [
dto field ( ' status ' , t enum ( ' PostStatus ' ), required: true ),
. . .
]
)
]
)สำหรับ php> = 8.0 enums ดั้งเดิมจะถูกสร้างขึ้นสำหรับรุ่นที่เก่ากว่าจะใช้การใช้งานแบบคลาสที่คล้ายกันมาก
DTOS มีวัตถุประสงค์เพื่อให้ข้อมูลของคุณพิมพ์อย่างมาก ประเภทสำหรับสคีมาคือ:
tint , tbool , tstring , tfloat - ประเภทสเกลาร์พื้นฐานtenum , tobject - สำหรับการอ้างอิงวัตถุ DTO อื่น ๆtdate - การใช้ dateTimeimmutabletexternal - สำหรับการอ้างอิงคลาสอื่น ๆ ที่ไม่ใช่ DTOtlist_(T) - ล้อมรอบ type t เพื่อประกาศ t []tmixed - ถ้าคุณไม่รู้จริงๆ (โดยที่ t เป็นนามแฝงของ KlkvskDtoGeneratorSchemaTypes )
นอกจากนี้คุณสามารถขยายคลาส Type นามธรรมสำหรับความต้องการของคุณ
DTOS สามารถสร้างขึ้นด้วยคอนสตรัคเตอร์ปกติหรือด้วยวิธี <DTO>::create(array $data)
วิธี create ยอมรับอาร์เรย์ที่เชื่อมโยงกับข้อมูล ข้อมูลนั้นจะ ถูกกรอง (หากต้องการทำความสะอาดล่วงหน้า) และ นำเข้า (แปลงเป็นประเภทที่เหมาะสม) หลังจากนั้นวิธีการเรียกตัวสร้างเริ่มต้นผ่านฟิลด์ที่นำเข้าไป คอนสตรัคเตอร์ได้รับฟิลด์ ที่ผ่านการตรวจสอบ ไม่เพียง แต่ตามประเภทเท่านั้น แต่ยังใช้ตรรกะที่กำหนดเอง
ดังนั้นจึงมีการจัดการข้อมูลสามขั้นตอนแต่ละอันสามารถอธิบายได้ในสคีมาด้วย callables:
filter เตรียมข้อมูลที่จะนำเข้าimporter casts ค่าเพื่อแก้ไขประเภทหรืออินสแตนซ์วัตถุที่ซ้อนกันvalidator ว่ามูลค่าที่นำเข้าตรงตามเกณฑ์ที่ระบุ การปิด filter และ importer ควรส่งคืนค่าที่ประมวลผล หากไม่มีการส่งคืน null การปิดเพิ่มเติมจะไม่ถูกเรียก
validator ส่งคืนจริง/เท็จและในเท็จจะมีการโยน InvalidArgumentException โดยอัตโนมัติ นอกจากนี้คุณสามารถโยนข้อยกเว้นของคุณเองและไม่กลับอะไรเลย
การปิด filter ประเภทและ validator ถูกกำหนดไว้ในสคีมา:
dtofield('age', tint(),
filters: [ fn ($x) => preg_replace('/[^0-9]+/', $x) ],
validators: [ fn ($x) => $x > 0 && $x < 100 ]
)
การปิดตัวของ importer มีการกำหนดไว้ล่วงหน้าสำหรับทุกประเภทยกเว้น tobject :
dtofield('file', texternal(SplFileInfo::class, fn ($x) => new SplFileInfo($x))
คุณสามารถระบุผู้นำเข้าที่กำหนดเองหากคุณขยาย Type สำหรับความต้องการของคุณเอง
ดู / ตัวอย่าง / DIR สำหรับสคีมาตัวอย่างและคลาสที่สร้างขึ้นสำหรับรุ่น PHP ที่แตกต่างกัน
ใบอนุญาต MIT (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม