Paket ini memungkinkan Anda untuk menghasilkan kelas DTO yang bersih dan independen (juga disebut "objek nilai") dengan skema yang dinyatakan secara singkat dalam php-code.
Anda hanya membutuhkan paket ini di lingkungan pengembangan, karena kelas yang dihasilkan tidak menggunakan apa pun dari kode perpustakaan ini. Itulah sebabnya cara yang disukai adalah memasukkannya sebagai require-dev :
$ composer require --dev klkvsk/dto-generator
Skema adalah file php reguler di mana saja di proyek Anda. File harus mengembalikan objek Schema dari tingkat atas.
Skema contoh:
<?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 ),
]
),
]
); Pembuatan kode dilakukan dengan perintah dto-gen :
$ ./vendor/bin/dto-gen [schema-file]
Secara default, generator mencari file yang dinamai atau diakhiri dengan dto.schema.php , tetapi Anda dapat memberikan file skema secara manual sebagai argumen.
Generator akan mencoba menebak jalur yang benar untuk output dengan melihat jalur autoload di composer.json. Jika menyatakan PSR-4 pemetaan untuk "MyProject\": "src/" maka file di atas akan ditempatkan di src/Data/Person.php .
Untuk mengesampingkan perilaku ini, Anda dapat menentukan outputDir secara langsung:
dto schema (namespace: " MyProject \ Data " , outputDir: " src/generated/ " , ...);Untuk menghasilkan kode yang menargetkan beberapa versi minimal PHP, gunakan:
./vendor/bin/dto-gen --target 7.4
Opsi ini memungkinkan atau menonaktifkan beberapa fitur bahasa yang lebih baru dalam kode yang dihasilkan.
Dimungkinkan untuk menghasilkan tidak hanya DTO, tetapi juga enum terkait:
dto schema(
objects: [
dto enum (
name: ' PostStatus '
cases: [ ' draft ' , ' published ' , ' deleted ' ]
),
dto object(
name: ' Post ' ,
fields: [
dto field ( ' status ' , t enum ( ' PostStatus ' ), required: true ),
. . .
]
)
]
)Untuk PHP> = 8.0 enum asli akan dihasilkan, untuk versi yang lebih lama, implementasi berbasis kelas yang sangat mirip digunakan.
DTOS melayani tujuan untuk menjaga data Anda sangat diketik. Jenis skema adalah:
tint , tbool , tstring , tfloat - tipe skalar dasartenum , tobject - untuk merujuk objek DTO lainnyatdate - Menggunakan datetimeimmutabletexternal - untuk merujuk kelas non -dto lainnyatlist_(T) - membungkus tipe t untuk mendeklarasikan t []tmixed - jika Anda benar -benar tidak tahu (Di mana t adalah alias ke KlkvskDtoGeneratorSchemaTypes )
Juga, Anda dapat memperpanjang kelas Type abstrak untuk kebutuhan Anda.
DTOS dapat dibuat dengan konstruktor reguler atau dengan metode <DTO>::create(array $data) .
Metode create menerima array asosiatif dengan data. Data itu kemudian disaring (jika perlu dibersihkan sebelumnya) dan diimpor (dikonversi ke jenis yang tepat). Setelah itu, metode ini memanggil konstruktor default, meneruskan bidang yang diimpor ke sana. Konstruktor mendapatkan bidang divalidasi tidak hanya berdasarkan jenis, tetapi dengan logika khusus.
Jadi, ada tiga tahap manipulasi data, masing -masing dapat dijelaskan dalam skema dengan callable:
filter menyiapkan data yang akan diimporimporter memberikan nilai untuk mengoreksi jenis atau instantiates objek bersarangvalidator memeriksa bahwa nilai impor memenuhi kriteria yang ditentukan Penutupan filter dan importer harus mengembalikan nilai yang diproses. Jika sebuah null dikembalikan, penutupan lebih lanjut tidak dipanggil.
validator Mengembalikan Benar/Salah, dan pada False InvalidArgumentException dilemparkan secara otomatis. Juga, Anda dapat melempar pengecualian sendiri dan tidak mengembalikan apa pun.
Penutupan filter tipe dan validator didefinisikan dalam skema:
dtofield('age', tint(),
filters: [ fn ($x) => preg_replace('/[^0-9]+/', $x) ],
validators: [ fn ($x) => $x > 0 && $x < 100 ]
)
Penutupan tipe importer telah ditentukan sebelumnya untuk semua jenis kecuali tobject :
dtofield('file', texternal(SplFileInfo::class, fn ($x) => new SplFileInfo($x))
Anda dapat menentukan importir khusus jika Anda memperpanjang Type untuk kebutuhan Anda sendiri.
Lihat / Contoh / DIR Untuk skema contoh dan kelas yang dihasilkan untuk versi PHP yang berbeda.
Lisensi MIT (MIT). Silakan lihat file lisensi untuk informasi lebih lanjut.