Роман
может переписать на 8.4) проект или 8.4 ещё тестируется
Роман
я так и не понял принятая ли это практика до 8.4 избавляться от get/set или лучше по старинке
The Ant
Блин... Или тут свойство буквально геттер ) пздц конечно определение
Kirill
короче, минусы полей: 1) Нет возможности описать интерфейсом, только через @property-read/@property-write аннотацию 2) Нет контроля доступа на чтение и запись, только через __get/__set, что ведёт к оверинжинерингу и getSome/setSome в данном случае лучше, нежели костыли через магию 3) Нет модификаторов доступа на "только чтение", решено в php 8, ранее через @readonly или @preoprty-read 4) Нет контроля типов решено в php 7
Kirill
это те причины зачем можно было писать геттеры и сеттеры
Роман
зачем нужен контроль доступа, что это значит, зачем интерфейсы
Kirill
вот и получается, что в современном мире php 8 они нужны только для п.1 и п.2, только в случае энтитей (и то спорно)
Kirill
зачем нужен контроль доступа, что это значит, зачем интерфейсы
namespace App\Shared\Domain\Id; interface IdentifiableInterface { /** * Provides an identifier of the entity. */ public IdInterface $id { get; } }
Роман
и зачем, полиморизм для сущностей, DI
Kirill
ну мало ли зачем, эвент сорсинг например
Kirill
или логгирование
Kirill
или ещё что
Kirill
кеширование
Kirill
мемоизация
Роман
ладно значит можно убрать этот оверхэд переписать на публичные свойства
Роман
а если понадобится к чему то можно и приделать get/set
Kirill
get/set методы эти как раз и нужны чтоб потом не приделывать ничего)
Kirill
надо просто не бездумно копипастить и повторять старые мантры, а голову подключать. Там где нужно использовать, а где нет - не использовать. В энтитях, если ты не собираешься вообще переезжать на 8.4, то лучше оставить как есть
Kirill
А в остальных местах, да, оно нахрен не надо
Роман
в остальных некогда и не использовал
Kirill
меня больше радует что чуваки пишут DTO так, а потом страдают)
Kirill
вместо того, чтоб просто написать что-то вроде: readonly class GameResponseDTO { /** * @param non-empty-string $id * @param non-empty-string $title * @param list<ProfileInfoDTO> $profiles */ public function __construct( public string $id, public string $title, public GameResponseType $type, public BanInfoResponseDTO $ban = new BanInfoResponseDTO(), public array $profiles = [], ) {} }
Роман
ага)
Роман
ещё toArray
Роман
а то как данные брать
Kirill
ну toArray не обязательно, есть же гидраторы/сериалайзеры
Юра
Блин не люблю свойства. Люди начинают туда пихать логику какую-то помимо валидации и потом ты смотришь на код в котором вроде просто присваивание значения какому-то проперти а там под капотом непонятно что. Затрудняет понимание кода без какого-то профита
Роман
что это
Kirill
что это
ну правила преобразований
Kirill
в ямлике описываешь и всё, типа такого: App\Presentation\Response\DTO\Game\EFTGameResponseDTO: read_only: false properties: id: { type: string } title: { type: string } edition: { type: App\Presentation\Response\DTO\Game\EFT\EditionResponseDTO } profiles: { type: array<App\Presentation\Response\DTO\Profile\ProfileInfoDTO> } ну или атрибутами
Роман
это что такое и как вызвать
Kirill
это что такое и как вызвать
в данном случае это конфиги JMS
Kirill
а так то в симфе из коробки оно своё
Роман
короче тоже оферхэд
Kirill
ну хз, по-мне написать один раз $serializer->toArray($dto) проще, чем у КАЖДОЙ дто описывать правила преобразования в ассоциативный массив
Роман
toArray норм, если наверно нет нескольких способов сериализации
Роман
а что в этом $serializer->toArray() магические методы?
Kirill
ну посмотри доки по симфони сериалайзеру
Роман
для преобразования всех свойств в массив
Kirill
https://symfony.com/doc/current/components/serializer.html
Kirill
только там не toArray, а normalize называется метод преобразования в примитивный объект (который потом хоть в json, хоть куда угодно отправляй)
Роман
namespace App\Model; class Person { private int $age; private string $name; private bool $sportsperson; private ?\DateTimeInterface $createdAt; // Getters public function getAge(): int { return $this->age; } public function getName(): string { return $this->name; } public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; } // Issers public function isSportsperson(): bool { return $this->sportsperson; } // Setters public function setAge(int $age): void { $this->age = $age; } public function setName(string $name): void { $this->name = $name; } public function setSportsperson(bool $sportsperson): void { $this->sportsperson = $sportsperson; } public function setCreatedAt(?\DateTimeInterface $createdAt = null): void { $this->createdAt = $createdAt; } } даже здесь подход с set/get
Роман
в доках говнокод не напишут)
Kirill
видно же что он для примера только
Kirill
чтоб понятнее было
Kirill
а так-то за такое надо наказывать
Роман
ну найди статью где пишут по другому и объясняют почему может ты один такой)
The Ant
ну это говнокод)
Стандартный код ентити, генерируемый самой симфой )
Kirill
да и пусть генерится себе)
Kirill
просто это глючный и кривой код
Kirill
плюс код лишний, который можно сократить в 10 раз
The Ant
Всю жизнь так делали, а сейчас глючный стал? Ну такое
Kirill
и при этом ничего не потерять вообще
The Ant
так делали джуны, карл)
А как синьоры делали?
Kirill
раньше?
The Ant
Угу
Kirill
выделяли предметную область энтитей
Kirill
и описывали их поведение
The Ant
Сложно...
Роман
```php namespace App\Model; class Person { public int $age; public string $name; public bool $sportsperson; public ?\DateTimeInterface $createdAt; } ``` так наверно X)
Роман
так ты сам такое рекомендовал
The Ant
это ещё хуже
Жесть. Ну давай как надо. Ток без новых гет/сет всратых конструкций из пхп 8.4
Kirill
капитан очевидность и мануал по основам ООП говорит явным языком, что во время создания объекта он должен иметь минимально допустимую информацию чтобы работал
Kirill
методы инициализации объектов фактически являются практикой плохого проектирования объекта
Kirill
вроде даже антипаттерн
Роман
```php namespace App\Model; class Person extand AbstractPerson { private int $age; private string $name; private bool $sportsperson; private ?\DateTimeInterface $createdAt; } class AbstractPerson { // Getters public function getAge(): int { return $this->age; } public function getName(): string { return $this->name; } public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; } // Issers public function isSportsperson(): bool { return $this->sportsperson; } // Setters public function setAge(int $age): void { $this->age = $age; } public function setName(string $name): void { $this->name = $name; } public function setSportsperson(bool $sportsperson): void { $this->sportsperson = $sportsperson; } public function setCreatedAt(?\DateTimeInterface $createdAt = null): void { $this->createdAt = $createdAt; } } ``` так что ли)
Kirill
это рофл?
Kirill
боже, голову включите)
Kirill
вместо рофлов
Kirill
у тебя new Person() создаст ПОЛОМАННЫЙ объект, который не будет работать
Kirill
что будет если ты напишешь $p = new Person(); echo $p->getName(); ?
Роман
а конструктор добавит со всеми полями
Kirill
как минимум