Digər obyektlər¶
Field¶
DTO property-sinin API-dəki adını və validasiya qaydalarını təyin edir.
final readonly class GoodsItem extends Data
{
public function __construct(
#[Field(name: 'namE_OF_GOODS', maxLength: 500)]
public string $name,
#[Field(name: 'goodsList', of: GoodsItem::class, max: 40)]
public array $items = [],
) {
}
}
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
name |
name |
string\|null |
API-nin gözlədiyi field adı. Verilməsə, property adı istifadə olunur. | ||
of |
of |
class-string\|null |
array tipli field-in element tipi (DTO və ya enum). |
||
maxLength |
maxLength |
int\|null |
Sətir üçün maksimum simvol sayı. | ||
minLength |
minLength |
int\|null |
Sətir üçün minimum simvol sayı. | ||
pattern |
pattern |
string\|null |
Sətir üçün PCRE şablonu (delimiter-lərlə birlikdə). Diqqət: PCRE-də $ sətrin sonundakı bir \n-i də qəbul edir, ona görə validasiya şablonlarında $ yox, \z istifadə edin. |
||
min |
min |
int\|float\|null |
Ədəd üçün minimum dəyər. | ||
max |
max |
int\|float\|null |
Ədəd üçün maksimum dəyər, və ya massiv üçün maksimum element sayı. | ||
minItems |
minItems |
int\|null |
Massiv üçün minimum element sayı. | ||
maxItems |
maxItems |
int\|null |
Massiv üçün maksimum element sayı. |
CastFailed¶
Tək bir property-nin çevirmə/validasiya xətası.
Mapper bu xətaları toplayıb sonda bir ValidationFailed-ə çevirir, ona görə
kitabxanadan kənara çıxmır.
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
message |
message |
string |
|||
code |
code |
int |
|||
previous |
previous |
?Throwable |
Data¶
Bütün sorğu və cavab DTO-larının baza class-ı.
DTO-lar readonly class kimi, konstruktorda promote olunmuş property-lərlə yazılır;
API-dəki ad və validasiya qaydaları #[Field] atributu ilə verilir:
final readonly class GoodsItem extends Data
{
public function __construct(
#[Field(name: 'namE_OF_GOODS', maxLength: 500)]
public string $name,
#[Field(name: 'goodS_ID')]
public ?string $categoryId = null,
) {
}
}
Həm PHP-dəki property adı, həm də API-dəki ad qəbul olunur, ona görə
GoodsItem::from(['name' => 'Kitab']) və GoodsItem::from(['namE_OF_GOODS' => 'Kitab'])
eyni nəticəni verir.
Field-i yoxdur.
Mapper¶
Massiv <-> DTO çevirməsini və validasiyanı həyata keçirən reflection mapper-i.
DTO-ların metadata-sı class başına bir dəfə hesablanıb keşlənir.
Field-i yoxdur.
PropertyMeta¶
Bir DTO property-si haqqında reflection-dan çıxarılmış metadata.
Mapper-in isti yolunda olduğu üçün tez-tez lazım olan qərarlar (tək tipdirmi, qaydası varmı, adı API adı ilə eynidirmi) burada əvvəlcədən hesablanır.
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
property |
property |
string |
✅ | PHP-dəki property adı. | |
name |
name |
string |
✅ | API-dəki field adı. | |
types |
types |
list<string> |
✅ | Qəbul edilən tiplər (null-suz). |
|
singleType |
singleType |
string\|null |
✅ | Yalnız bir tip varsa, həmin tip. | |
nullable |
nullable |
bool |
✅ | null qəbul edirmi. |
|
hasDefault |
hasDefault |
bool |
✅ | Default dəyəri varmı. | |
default |
default |
mixed |
✅ | Default dəyər. | |
validates |
validates |
bool |
✅ | Ən azı bir validasiya qaydası varmı. | |
nameMatchesProperty |
nameMatchesProperty |
bool |
✅ | API adı property adı ilə eynidirmi. | |
field |
field |
Field |
✅ | Atributun özü. |
HttpTransport¶
PSR-18 üzərində qurulmuş transport.
Klient və factory-lər verilməzsə, php-http/discovery vasitəsilə tətbiqdə
mövcud olan implementasiyalar tapılır (Guzzle, Symfony HttpClient və s.).
Hər şey lazy qurulur: obyekt yaradılarkən yox, ilk sorğuda.
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
client |
client |
?ClientInterface |
|||
requests |
requests |
?RequestFactoryInterface |
|||
streams |
streams |
?StreamFactoryInterface |
|||
logger |
logger |
?LoggerInterface |
| Metod | Qaytarır | Nə edir |
|---|---|---|
send() |
Response |
RecordingTransport¶
Sorğu göndərmədən onları yadda saxlayan transport.
İki işə yarayır:
- Testlər — hazır cavabları növbəyə qoyub göndərilən sorğuları yoxlamaq;
- Debug — real sorğu atmadan hansı url-in, header-lərin və payload-un göndəriləcəyini görmək (əvvəlki "dry" rejiminin əvəzi, lakin klientin qaytarış tiplərini pozmadan).
$transport = new RecordingTransport();
$transport->queue(Response::json(['code' => 200]));
$client = new EPointClient($config, $transport);
$client->declare($package);
$transport->lastRequest()->uri; // göndərilən url
$transport->lastRequest()->body; // göndərilən payload
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
fallback |
fallback |
Response\|null |
Növbə boşaldıqdan sonra qaytarılacaq cavab. Verilməsə, gözlənilməyən sorğu exception qaldırır: səssizcə 200 qaytarmaq "bir dəfə çağırılır" testinin dörd çağırışda da keçməsinə səbəb olurdu. |
| Metod | Qaytarır | Nə edir |
|---|---|---|
queue() |
RecordingTransport |
Növbəti sorğunun cavabını növbəyə qoyur. |
send() |
Response |
|
requests() |
array |
Göndərilmiş bütün sorğular. |
lastRequest() |
Request |
Son göndərilmiş sorğu. |
count() |
int |
|
reset() |
RecordingTransport |
Yadda saxlanmış sorğuları və növbəni təmizləyir. |
Request¶
Göndəriləcək sorğunun dəyişməz (immutable) təsviri.
PSR-7 RequestInterface-dən fərqli olaraq body burada hələ də massivdir —
JSON-a çevirmə HttpTransport-un işidir. Bu, testlərdə payload-u sətir kimi
deyil, olduğu kimi yoxlamağa imkan verir.
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
method |
method |
string |
✅ | HTTP metodu (GET, POST, ...). |
|
uri |
uri |
string |
✅ | Sorğunun tam url-i. | |
body |
body |
stdClass\|array\|null |
Body. PHP-də [] həm boş obyekt, həm boş siyahıdır; JSON-a [] kimi yazılır. Boş obyekt göndərmək üçün new stdClass() verin (bax: Client::objectBody()). |
||
query |
query |
array |
Query parametrləri. | ||
headers |
headers |
array |
Sorğu header-ləri. |
| Metod | Qaytarır | Nə edir |
|---|---|---|
withHeader() |
Request |
Header əlavə edilmiş yeni sorğu qaytarır. |
withHeaders() |
Request |
Header-lər əlavə edilmiş yeni sorğu qaytarır. |
bodyIsList() |
bool |
Body kök səviyyədə JSON array-dirsə true. |
Response¶
Servisdən gələn xam cavab.
Klient metodları adətən bunu birbaşa qaytarmır — to() / toList() ilə konkret
DTO-ya çevirib qaytarırlar. Cavabın özünə (status, header, xam body) yalnız
RequestFailed exception-ı vasitəsilə, və ya Transport səviyyəsində baxılır.
| Property | Məftildəki ad | Tip | Məcburi | Qaydalar | Təsvir |
|---|---|---|---|---|---|
status |
status |
int |
✅ | HTTP status kodu. | |
headers |
headers |
array |
✅ | Cavabın header-ləri. | |
body |
body |
string |
✅ | Xam body mətni. |
| Metod | Qaytarır | Nə edir |
|---|---|---|
isSuccessful() |
bool |
|
header() |
?string |
Header-in ilk dəyəri. |
headerValues() |
array |
Header-in bütün dəyərləri (təkrarlana bilən header-lər üçün). |
toArray() |
array |
Body-ni massiv kimi qaytarır. |
to() |
Data |
Body-ni verilmiş DTO-ya çevirir. |
toList() |
array |
Kök səviyyəsində array olan body-ni DTO siyahısına çevirir. |