data transfer object php

Чистим ΠΏΡ…ΠΏΡˆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DTO

Π­Ρ‚ΠΎ моя пСрвая ΡΡ‚Π°Ρ‚ΡŒΡ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΌΠ½ΠΈ приготовился.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² PHP слоТился историчСски, ΠΈΠ·-Π·Π° отсутствия строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ сСбС ООП. Π’Π΅Π΄ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎ ΠΌΠ½Π΅, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с 7 вСрсии ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ+ООП, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ strict_types ΠΈ type hinting.

Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ описаниСм массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ. Или вовсС пСрСдаСтся ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ массив с мусором, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ просто Π±Π΅Ρ€Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΅ΠΌΡƒ ΠΊΠ»ΡŽΡ‡ΠΈ. НапримСр, сСрвис ΠΏΠΎ созданию ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

МСня Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ устраиваСт, поэтому я ΡƒΠΆΠ΅ Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡΡŒ DTOβ€™ΡˆΠ΅ΠΊ. ΠœΡ‹ создаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ DTO ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈ Π΅Π³ΠΎ ΡƒΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ. И Ρ‚ΠΎΠ³Π΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΡ‹ с ΠΏΠΎΠ»Π½ΠΎΠΉ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠœΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго, Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρƒ нас становится Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‡ΠΈΡ‰Π΅.

Но Ρ‚ΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΆΠ΅ придСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ DTO, Π° это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π΅Π»ΡŽΠ΄ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈ ΠΆΠΈΡ€Π½Π΅ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€. ΠΠ΅Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’Π΅Π΄ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΈ ΠΊ Π½Π΅ΠΌΡƒ Π² запросС, привСсти ΠΈΡ… ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ структурС ΠΈ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΈΠ»ΠΈ сСрвису.

БобствСнно, Ρ‚Π°ΠΊ ΠΈ появился ΠΌΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚.

ИспользованиС ClassTransformer

Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ я автоматичСски ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΠΌΠ½Π΅ классу. Рассмотрим Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ всС Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ созданиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. К Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ запрос, ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’ ΠΌΠΎΠ΅ΠΌ случаС Π½Π° Laravel ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ это выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’ запросС ΠΊ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²: name, phone ΠΈ email. ΠŸΠ°ΠΊΠ΅Ρ‚ просто смотрит Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρƒ класса, ΠΈ, Ссли Π΅ΡΡ‚ΡŒ, сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС просто отсСиваСт ΠΈΡ…. На Π²Ρ…ΠΎΠ΄Π΅ transform ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массив, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ object, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Ρ‹ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Но наимСнования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ. Π’ΠΎΠ³Π΄Π°, Π² созданной Π½Π°ΠΌΠΈ DTO, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ спокойно ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ привСдСния:

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС, с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса, Π»ΠΈΠ±ΠΎ массивом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π§Ρ‚ΠΎ ΠΆΠ΅ с Π½ΠΈΠΌΠΈ? ВсС просто, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π² PHPDoc ΠΏΡƒΡ‚ΡŒ ΠΊ классу ΠΈ всС. Π’ случаС массива Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΡ… ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этот массив:

Указывая ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ класс, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ связСй. ΠŸΠ°ΠΊΠ΅Ρ‚ рСкурсивно Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ всСм Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΈΡ… ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ.

ΠŸΡƒΡ‚ΡŒ ΠΊ классу ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΌ, Ρ‚.ΠΊ. ΠΈΠ½Π°Ρ‡Π΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ класса для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Или это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ alias ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ», Π° это ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ сСрвиса.

ΠœΠ΅Ρ‚ΠΎΠ΄ сСрвиса Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ

Π—Π½Π°Π΅ΠΌ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

МоТно Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° становится ΠΏΡ€ΠΎΡ‰Π΅, Π·Π° счСт удалСния привСдСния Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ

Π’ IDE Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ всС подсказки.

Аналоги

Он ΠΏΡ‹Ρ‚Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ DTO, Π½ΠΎ ΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ заставляСт ваш класс Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΈΡ… DTO, ΠΈ самим Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, пСрСдавая Π² конструктор Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ я Π½Π΅ Π²ΠΈΠΆΡƒ особо ΠΏΡ€ΠΎΡ„ΠΈΡ‚Π° использования, вСдь я Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠ³Ρƒ сам ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ new DTO() ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Roadmap

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ afterTransform, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DTO. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ классу. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ссли Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… DTO, Π½ΡƒΠΆΠ½ΠΎ самому ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ transform. И Ссли Ρƒ нас ΠΈΠ· 20 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ отличаСтся ΠΊΠ»ΡŽΡ‡, Π½Π°ΠΌ придСтся ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ всСх 20. А с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ afterTransform ΠΌΡ‹ смоТСм ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Data transfer object php

Data transfer objects with batteries included

data transfer object php data transfer object php data transfer object php

You can install the package via composer:

data transfer object php

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You’ll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

The goal of this package is to make constructing objects from arrays of (serialized) data as easy as possible. Here’s what a DTO looks like:

You could construct this DTO like so:

Let’s discuss all possibilities one by one.

Constructing a DTO can be done with named arguments. It’s also possible to still use the old array notation. This example is equivalent to the one above.

If a DTO has a property that is another DTO or a DTO collection, the package will take care of automatically casting arrays of data to those DTOs:

You can build your own caster classes, which will take whatever input they are given, and will cast that input to the desired result.

Take a look at the ComplexObject :

And its caster ComplexObjectCaster :

Instead of specifying which caster should be used for each property, you can also define that caster on the target class itself:

It’s possible to define default casters on a DTO class itself. These casters will be used whenever a property with a given type is encountered within the DTO class.

Using custom caster arguments

Any caster can be passed custom arguments, the built-in ArrayCaster implementation is a good example of how this may be used.

Using named arguments when passing input to your caster will help make your code more clear, but they are not required.

Note that the first argument passed to the caster constructor is always the array with type(s) of the value being casted. All other arguments will be the ones passed as extra arguments in the CastWith attribute.

This package doesn’t offer any specific validation functionality, but it does give you a way to build your own validation attributes. For example, NumberBetween is a user-implemented validation attribute:

It works like this under the hood:

You can map a DTO property from a source property with a different name using the #[MapFrom] attribute.

It works with a «dot» notation property name or an index.

Sometimes you also want to map them during the transformation to Array. A typical usecase would be transformation from camel case to snake case. For that you can use the #[MapFrom] attribute.

The previous version of this package added the FlexibleDataTransferObject class which allowed you to ignore properties that didn’t exist on the DTO. This behaviour has been changed, all DTOs are flexible now by default, but you can make them strict by using the #[Strict] attribute:

There are also some helper functions provided for working with multiple properties at once.

Note that all() will simply return all properties, while toArray() will cast nested DTOs to arrays as well.

You can chain the except() and only() methods:

It’s important to note that except() and only() are immutable, they won’t change the original data transfer object.

Immutable DTOs and cloning

This package doesn’t force immutable objects since PHP doesn’t support them, but you’re always encouraged to keep your DTOs immutable. To help you, there’s a clone method on every DTO which accepts data to override:

Collections of DTOs

This version removes the DataTransferObjectCollection class. Instead you can use simple casters and you own collection classes.

Here’s an example of casting a collection of DTOs to an array of DTOs:

If you don’t want the redundant typehint, or want extended collection functionality; you could create your own collection classes using any collection implementation. In this example, we use Laravel’s:

Simple arrays of DTOs

Please see CHANGELOG for more information on what has changed recently.

Please see CONTRIBUTING for details.

If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker.

You’re free to use this package, but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using.

Our address is: Spatie, Kruikstraat 22, 2018 Antwerp, Belgium.

We publish all received postcards on our company website.

Our Arr class contains functions copied from Laravels Arr helper.

The MIT License (MIT). Please see License File for more information.

About

Data transfer objects with batteries included

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Data transfer object php

Data transfer object for arrays

Zero-dependency library to convert associative arrays to an object model

You can install the package via composer:

The goal of this package is to give a convenient declared way to manipulate data extracted from associative arrays. Advantages of object structure:

Let’s look at the example of a JSON API call:

Working with this array is difficult, as we’ll always have to refer to the documentation to know what’s exactly in it. This package allows you to create data transfer object definitions, classes, which will represent the data in a structured way.

We did our best to keep the syntax and overhead as little as possible:

An object of PostData can from now on be constructed like so:

Now you can use this data in a structured way:

By adding doc blocks to our properties, their values will be validated against the given type; and a TypeError will be thrown if the value doesn’t comply with the given type.

Here are the possible ways of declaring types:

PHP 7.4 typed properties are the source of types like PHP doc is. The compatibility of declared types is upon to the developer. Feel free to use one of them, both or none at all.

By default, the array key the value is taken from is the property name. If you need to specify the key of the original array the value should be taken from you should use @source doc comment:

Automatic casting of nested DTOs

If you’ve got nested DTO fields, data passed to the parent DTO will automatically be cast.

PostData can now be constructed like so:

Automatic casting of nested array DTOs

Similarly to above, nested array DTOs will automatically be cast.

PostData will automatically construct tags like such:

Beside property type validation, you can also be certain that the data transfer object in its whole is always valid. On constructing a data transfer object, we’ll validate whether all required (non-nullable) properties are set. If not, a Amorphine\DataTransferObject\Exceptions\DataTransferObjectError will be thrown.

The MIT License (MIT). Please see License File for more information.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

DTO vs POCO vs Value Object

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ DTO, POCO ΠΈ Value Object

Π’Π½Π°Ρ‡Π°Π»Π΅ нСбольшая Ρ€Π΅ΠΌΠ°Ρ€ΠΊΠ° ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Value Object. Π’ C# сущСствуСт похоТая концСпция, называСмая Value Type. Π­Ρ‚ΠΎ всСго лишь Π΄Π΅Ρ‚Π°Π»ΡŒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ хранятся Π² памяти ΠΈ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠ°ΡΠ°Ρ‚ΡŒΡΡ этого. Value Object, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, β€” понятиС ΠΈΠ· срСды DDD (Domain-Driven Design).

Ок, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ. Π’Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ понятия ΠΊΠ°ΠΊ DTO, Value Object ΠΈ POCO часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ синонимы. Но Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅?

DTO β€” это класс, содСрТащий Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ. DTO ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ прилоТСниями, Π»ΠΈΠ±ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ слоями Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, СдинствСнная Ρ†Π΅Π»ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Value Object β€” это ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½ вашСй Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Он подчиняСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ сущности (Entities). ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Value Object ΠΈ Entity Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Value Object-Π° Π½Π΅Ρ‚ собствСнной идСнтичности. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π° Value Object-Π° с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ свойствами ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Π²Π΅ сущности ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π΄Π°ΠΆΠ΅ Π² случаС Ссли ΠΈΡ… свойства ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

Value Object-Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями.

POJO Π±Ρ‹Π» прСдставлСн ΠœΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΌ Π€Π°ΡƒΠ»Π΅Ρ€ΠΎΠΌ Π² качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ для JavaBeans ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… «тяТСлых» enterprise-конструкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ популярны Π² Ρ€Π°Π½Π½ΠΈΡ… 2000-Ρ….

Основной Ρ†Π΅Π»ΡŒΡŽ POJO Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½ прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ смодСлирован Π±Π΅Π· использования JavaBeans. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, JavaBeans Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для этой Ρ†Π΅Π»ΠΈ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½Ρ‚ΠΈ-POCO ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° β€” Entity Framework Π΄ΠΎ вСрсии 4.0. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс, сгСнСрированный EF, наслСдовал ΠΎΡ‚ EntityObject, Ρ‡Ρ‚ΠΎ привносило Π² Π΄ΠΎΠΌΠ΅Π½ Π»ΠΎΠ³ΠΈΠΊΡƒ, ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для EF. Начиная с вСрсии 4, Entity Framework Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с POCO модСлью β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ EntityObject.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, понятиС POCO ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ использованиС Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ простых классов насколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ для модСлирования ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области. Π­Ρ‚ΠΎ понятиС ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² YAGNI, KISS ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… best practices. POCO классы ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ.

ΠšΠΎΡ€Ρ€Π΅Π»ΡΡ†ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ понятиями

Π•ΡΡ‚ΡŒ Π»ΠΈ связи ΠΌΠ΅ΠΆΠ΄Ρƒ этими трСмя понятиями? Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, DTO ΠΈ Value Object ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ взаимозамСняСмо. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, POCO β€” это надмноТСство для DTO ΠΈ Value Object:

data transfer object php

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Value Object ΠΈ DTO Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌ сторонним ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ POCO. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, POCO β€” это Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ понятиС: это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Value Object, Entity, DTO ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс Π² Ρ‚ΠΎΠΌ случаС Ссли ΠΎΠ½ Π½Π΅ наслСдуСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, Π½Π΅ относящимся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.

Π’ΠΎΡ‚ свойства ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…:

data transfer object php

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ POCO-класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ, ΠΈ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ собствСнной идСнтичности, Ρ‚.ΠΊ. ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Value Object, Ρ‚Π°ΠΊ ΠΈ Entity. Π’Π°ΠΊΠΆΠ΅, POCO ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя. Π­Ρ‚ΠΎ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ POCO DTO.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² PHP. Data Transfer Object. ΠŸΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Laravel

Π’ основС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π»Π΅ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΡ‡Ρ‚ΠΈ каТдая Π·Π°Π΄Π°Ρ‡Π° прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π»ΡŽΠ±Ρ‹ΠΌ способом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ бизнСс.

Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΠΈ сами это Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ: Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Π½Π΅ с создания ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ², Π° с создания ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ Laravel. ΠšΡ€ΡƒΠΏΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ создания ERDs ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ для ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Волько ΠΊΠΎΠ³Π΄Π° это ясно, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с вашими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² структурированном Π²ΠΈΠ΄Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π² вашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этих Π΄Π°Π½Π½Ρ‹Ρ… прСдсказуСмым ΠΈ бСзопасным способом.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ сСйчас Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ модСлях, Π½ΠΎ это Π½Π΅ совсСм Ρ‚Π°ΠΊ. Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ нСсколько шагов Π½Π°Π·Π°Π΄.

ВСория Ρ‚ΠΈΠΏΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (DTO) Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΠΌ нСсколько Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ я объясню, ΠΊΠ°ΠΊ я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π‘ΠΈΠ»Π° Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ – сильная ΠΈΠ»ΠΈ слабая типизация – опрСдСляСт, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ пСрСмСнная ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой Ρ‚ΠΈΠΏ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°.

PHP – это слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык:

PHP ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π°Π±ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ. Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ языком, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² основном Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с HTTP-запросом, практичСски всС являСтся строкой.

Π”Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ систСма Ρ‚ΠΈΠΏΠΎΠ² PHP слаба. Подсказки Ρ‚ΠΈΠΏΠ° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π±Π΅Π· Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ любого Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ эта пСрСмСнная.

Как я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», PHP ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π°Π±ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ строка. Однако Ρƒ сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ интСрСсноС свойство: Π΄Π°Π½Π½Ρ‹Π΅ приходят с гарантиями качСства Π΄Π°Π½Π½Ρ‹Ρ…. Если пСрСмСнная ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ измСняСтся, Ρ‚ΠΎ Ρ†Π΅Π»Ρ‹ΠΉ ряд Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… дСйствий просто большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ.

Π’ΠΈΠ΄ΠΈΡ‚Π΅ Π»ΠΈ, матСматичСски Π΄ΠΎΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎ, Ρ‡Ρ‚ΠΎ Ссли строго типизированная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π» Ρ†Π΅Π»Ρ‹ΠΉ ряд ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, сильная типизация Π΄Π°Π΅Ρ‚ программисту Π»ΡƒΡ‡ΡˆΡƒΡŽ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π΅Π΄Π΅Ρ‚ сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½.

Π’ качСствС примСчания: это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ошибок! Π’Ρ‹ прСкрасно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π³Π»ΡŽΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Но ΠΊΠΎΠ³Π΄Π° строго типизированная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ компилируСтся, Π²Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ошибок Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

БтатичСскиС ΠΈ динамичСскиС Ρ‚ΠΈΠΏΡ‹

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° концСпция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ: статичСскиС ΠΈ динамичСскиС Ρ‚ΠΈΠΏΡ‹. И ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь всС Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ интСрСсным.

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, это ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… сторон PHP: просто написал скрипт, ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» страницу ΠΈ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π­Ρ‚ΠΎ большая Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с языком, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ скомпилирован, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ это, поэтому ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ являСтся Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½Ρ‹ΠΌ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ΠΌ. Однако этого достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΡƒΡ‚ΡŒ дальшС.

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π΅ΡΡ‚ΡŒ ΠΈ обратная сторона: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ PHP провСряСт свои Ρ‚ΠΈΠΏΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ ΠΏΡ€ΠΈ запускС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ чСткая ошибка для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π»Π° ΠΊΡ€Π°Ρ….

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя выполнСния Π΄Π΅Π»Π°Π΅Ρ‚ PHP динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языком. ΠŸΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык программирования ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ всСх Ρ‚ΠΈΠΏΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈ компиляции.

Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ довольно ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ вашСм ΠΊΠΎΠ΄Π΅, Π±Π΅Π· нСобходимости Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, IDE, такая ΠΊΠ°ΠΊ PhpStorm, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство встроСнных статичСских ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ.

ИмСя Π² Π²ΠΈΠ΄Ρƒ всю эту ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ядру нашСго прилоТСния: Π΄Π°Π½Π½Ρ‹ΠΌ.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ нСструктурированных Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π»ΠΈ Π²Π°ΠΌ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с β€œΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ данных”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π±Ρ‹Π» большС, Ρ‡Π΅ΠΌ просто список? Π’Ρ‹ использовали ΠΊΠ»ΡŽΡ‡ΠΈ массива Π² качСствС ΠΏΠΎΠ»Π΅ΠΉ? И Π²Ρ‹ чувствовали боль ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Π»ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π² этом массивС? НС Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊΠΈΠΌΠΈ Π²Ρ‹ ΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ поля доступны?

Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим сСбС, ΠΎ Ρ‡Π΅ΠΌ я Π³ΠΎΠ²ΠΎΡ€ΡŽ: Ρ€Π°Π±ΠΎΡ‚Π° с запросами Laravel. Рассмотрим этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ CRUD для обновлСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ находится Π² этой свалкС:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС Π½Π° ΠΌΠΈΠ½ΡƒΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π°Π΄ этим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈ Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ»Π»Π΅Π³Π° написал этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΏΡΡ‚ΡŒ мСсяцСв Π½Π°Π·Π°Π΄: я ΠΌΠΎΠ³Ρƒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅, Π½Π΅ дСлая Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ, пСрСчислСнных Π²Ρ‹ΡˆΠ΅.

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ систСмы Π² сочСтании со статичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ большим ΠΏΠΎΠ΄ΡΠΏΠΎΡ€ΡŒΠ΅ΠΌ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, с Ρ‡Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ. Π’Π°ΠΊΠΈΠ΅ языки, ΠΊΠ°ΠΊ Rust, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ просто:

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ! К соТалСнию, PHP Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ структур. Но Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ массивы ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нашСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ свойства доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с PHP 7.4. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… β€” Ρƒ мСня Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для вас ΠΏΠΎΠ·ΠΆΠ΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ.

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PHP 7.4 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

БтатичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, встроСнный Π² Π²Π°ΡˆΡƒ IDE, всСгда смоТСт ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π½Π°ΠΌ, с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ.

Π­Ρ‚ΠΎΡ‚ шаблон ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ нСструктурированных Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΈΠΏΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наши Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ способом, называСтся β€œΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ данных” ΠΈΠ»ΠΈ DTO (Data Transfer Object). Π­Ρ‚ΠΎΡ‚ шаблон я Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Для срСдних ΠΈ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹ΠΉ шаблон Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π΅Π½.

ΠžΠ±ΡΡƒΠΆΠ΄Π°Ρ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ, Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ ΠΈΠ»ΠΈ Π² сообщСствС Laravel, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с людьми, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅ сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. На самом Π΄Π΅Π»Π΅ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈ ΡΠ»Π°Π±ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ PHP. И Ρ‚ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π² своС ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΈΠ΅.

По ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΡ‚ΡŒ большС прСимущСств Π² строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ³ΠΎ количСства Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ. Π’Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ своСго ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ хотят Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ находится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ прямо ΠΏΠΎΠ΄ Ρ€ΡƒΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ: создании прилоТСния.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, использованиС DTO ΠΈΠΌΠ΅Π΅Ρ‚ свою Ρ†Π΅Π½Ρƒ: ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этих классов; Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, запрос Π΄Π°Π½Π½Ρ‹Ρ… с DTO.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования DTO ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°ΡŽΡ‚. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Ρ‹ потСряСтС, написав этот ΠΊΠΎΠ΄, Π²Ρ‹ компСнсируСтС Π΅Π³ΠΎ Π² долгосрочной пСрспСктивС.

Однако вопрос ΠΎ построСнии DTO ΠΈΠ· β€œΠ²Π½Π΅ΡˆΠ½ΠΈΡ…β€ Π΄Π°Π½Π½Ρ‹Ρ… всС Π΅Ρ‰Π΅ нуТдаСтся Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅.

Π€Π°Π±Ρ€ΠΈΠΊΠΈ DTO

Как ΠΌΡ‹ строим DTO? Π― подСлюсь с Π²Π°ΠΌΠΈ двумя возмоТностями, Π° Ρ‚Π°ΠΊΠΆΠ΅ объясню, какая ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΠ΅ Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ-самый ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ: использованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ.

НаличиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ сохраняСт ваш ΠΊΠΎΠ΄ чистым Π½Π° протяТСнии всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π­Ρ‚Π° Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΆΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌ слоС.

Π§Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅? Ну, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…: ΠΎΠ½ добавляСт ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для прилоТСния Π»ΠΎΠ³ΠΈΠΊΡƒ Π² Π΄ΠΎΠΌΠ΅Π½. DTO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠΈΠ²Π΅Ρ‚ Π² Π΄ΠΎΠΌΠ΅Π½Π΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΎ CustomerRequest классС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠΈΠ²Π΅Ρ‚ Π² ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌ слоС.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ смСшиваниС ΠΊΠΎΠ΄Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄ΠΎΠΌΠ΅Π½Π°-Π½Π΅ самая Π»ΡƒΡ‡ΡˆΠ°Ρ идСя. Однако Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅. На Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈ это Π±ΠΎΠ»Π΅Π΅ ваТная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°; я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· собствСнных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ PHP: ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Π’ΠΈΠ΄ΠΈΡ‚Π΅ Π»ΠΈ, Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши DTO Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΠΌΠ΅Π»ΠΈ конструктор с ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ свойства: это Π½Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со свойствами nullable ΠΈΠ»ΠΈ default-value. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ массива Π² DTO, ΠΈ ΠΏΡƒΡΡ‚ΡŒ ΠΎΠ½ строит сСбя Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… Π² этом массивС.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, статичСский Π°Π½Π°Π»ΠΈΠ· Ρ‚Π°ΠΊΠΆΠ΅ нСдоступСн, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² Π½Π΅Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΏΡ€ΠΈ построСнии DTO. Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ это β€œΠΏΡ€Π΅Π±Ρ‹Π²Π°Π½ΠΈΠ΅ Π² тСмнотС” Π² классС DTO, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… мыслСй ΠΈΠ·Π²Π½Π΅.

Если Π±Ρ‹ PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², я Π±Ρ‹ использовал Ρ‚Π°ΠΊΠΎΠΉ шаблон:

Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° PHP Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΡ‚ это, я Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» прагматичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ тСорСтичСски ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ. Но это зависит ΠΎΡ‚ тСбя. НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ вашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π»ΡƒΡ‡ΡˆΠ΅ всСго.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ свойствам

Как я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Ρ€Π°Π½Π΅Π΅, сущСствуСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° использованию Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… свойств для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ DTO: docblocks. ΠŸΠ°ΠΊΠ΅Ρ‚ DTO ΠΎΡ‚ Spatie, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ примСняли, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ….

Однако ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ docblocks Π½Π΅ Π΄Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ относятся ΠΊ Ρ‚ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ говорят. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, PHP ΠΈΠΌΠ΅Π΅Ρ‚ свой API рСфлСксии, ΠΈ с Π½ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС.

РСшСниС, прСдоставляСмоС этим ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ систСмы Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ PHP. Если Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PHP 7.4 ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС увСрСнности Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваши Ρ‚ΠΈΠΏΡ‹ docblock Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°ΡŽΡ‚ΡΡ, этот ΠΏΠ°ΠΊΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Π»Π΅ΠΆΠ°Ρ‚ Π² основС ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π²Π°ΠΌ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ структурированным, бСзопасным ΠΈ прСдсказуСмым способом.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *