Сегодня столкнулся с одной тривиальной задачей. Настолько тривиальной, что не смог сразу придумать решение, хотя раньше уже сталкивался с ней, но обошёлся костылями.
Задача заключается в следующем: фронту надо менять данные в базе по одному полю за раз (например, настройки). Можно сделать эндпоинт на каждое поле и получить огромную головную боль, пытаясь написать на всё валидаторы и обвязку. А можно написать один эндпоинт, который принимает айди модели и любые данные для обновления.
В DTO с данными для обновления помечаем каждое поле как nullable и при сохранении обновляем только те данные, которые !== null, то есть, которые реально пришли с фронта.
Готово! Но только до тех пор, пока в настройках не появится необязательное поле, которое само по себе может принимать значение null.
В этом случае уже не получится к типу поля просто прибавить ещё один null, иначе получится что-то странное вроде ?bool|null, не являющееся валидным php.
Я из такой ситуации вышел самым простым способом, добавив пустой класс NotSet и дополнив все типы полей этим типом. То есть, private ?int $value стал private int|null|NotSet $value.
В итоге при обновлении данных использовать нужно только те поля, которые дают false в ответ на $value instanceof NotSet. Таким образом мы точно знаем, что фронту нужно записать именно это значение, даже если это null.
Ещё один момент, при запихивании данных из приходящего json`а в `DTO, необходимо писать следующее — array_key_exists($data, ‘key’) ? $data[‘key’] : new NotSet(), так как $data[‘key’] ?? new NotSet() не даст нужного результата. Не очень красиво, но тут функциональность преобладает над красотой.
А вот были бы у нас дженерики, тогда можно было бы просто забахать private Optional<?int> $value и жизнь была бы прекрасна, но увы 🙁
О разработке, работе руками и сношении с машиной
-
NotSet вместо null для частичных обновлений
-
Новый коворкинг
Сегодня заехал в новый коворк в квартале от дома
Сижу теперь и в окружении одни программисты, очень круто
Атмосфера совсем другая, аж работать легче стало
Один чел не гнушается на обеде в доту поигрывать, у других сервак для майнкрафта поднят — в общем, работа кипит😃
-
-
-
-
-
Три года в разработке
Сегодня ровно 3 года как я начал работать разработчиком
Не думал, что так быстро время пролетит и что я окажусь там, где я сейчас есть
В целом, можно было лучше, можно было бы уже где-нибудь тимлидом сидеть, но в принципе и так норм 😀
Дальше должно быть только интереснее, посмотрим куда занесёт
-
От VSCode до Vim
В начале карьеры терпеть не мог продукты JetBrains, совершенно не понимал куда столько функционала, если в VSCode такой же есть, но быстрее и красивее. Сейчас — попробуйте меня заткните, если только разговор коснётся IDE. Я даже для простецкого доступа к базе пересел на DataGrip, потому что ничего лучше ещё не изобрели.
Но что ещё хуже — сегодня я понял, что почти на каждое действие в шторме у меня есть горячая клавиша, чтобы работать быстрее. Держа эту мысль в голове я как под гипнозом совершил сумасшедшее действие — открыл и поправил файл на тестовом серваке через vim. Наверное, пора лечить голову. А может быть это начало чего-то нового🤔
-
-
RFC про уровни доступа к свойствам PHP
В прошлом году были новости о новом RFC, в котором предлагалось сделать разные уровни доступов к переменным. Например,
publicдля чтения,privateдля модификации. Синтаксис был просто отвратительный — грязь в чистом виде.
А сегодня я посмотрел видео от JetBrains, где обсуждались новости за прошедший месяц и среди этих новостей промелькнул RFC в статусе черновика над которым, по всей видимости, и работают в текущий момент ребята из core-team.
В этом RFC обновлён синтаксис и он по сути копирует C#, и всё что я могу сказать — я влюбился. Если это когда-то завезут в пхп, то это будет просто бомба. На равне с readonly, match и прочими крутыми плюшками.

