TGViewer
Channel Public Channel
Пых

Пых

@phpyh

Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://t.me/isPHPdying

Статистика: https://t.me/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Subscribers
7.83K
Photos
287
Videos
20
Links
629

Showing posts older than #45 · Back to latest

Older Posts 20 shown
Post #44 672
Надеюсь, все знают, что начиная с Symfony 4.1 можно инлайнить конфигурацию роутов в путь.
То есть вместо
@Route("/studies/{studyId}", requirements={"studyId"="\d+"}, methods={"PUT"})
писать
@Route("/studies/{studyId<\d+>}", methods={"PUT"})


Если вдруг нет, читайте новость от 22 марта прошлого года: https://symfony.com/blog/new-in-symfony-4-1-inlined-routing-configuration. Или ищите в документации https://symfony.com/doc/current/routing.html по слову inline.

Но что если у нас UUID? Не указывать же каждый раз этот гигантский Regex!
@Route("/studies/{studyId<[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}>}", methods={"PUT"})


Тут нам приходят на помощь параметры контейнера.
parameters:
regex.uuid: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'

@Route("/studies/{studyId<%regex.uuid%>}", methods={"PUT"})


Подробнее тут: https://symfony.com/doc/4.2/routing/service_container_parameters.html (страница доступна только для 4.2, потому что документацию сейчас реструктуризируют).
Symfony New in Symfony 4.1: Inlined routing configuration (Symfony Blog) In Symfony 4.1 you can inline the requirements and default values in the route path to make the config more concise.
Post #43 972
Класс должен быть либо абстрактным, либо финальным.

Мотивация:
- https://www.tomasvotruba.cz/blog/2019/03/28/how-to-mock-final-classes-in-phpunit/;
- https://ocramius.github.io/blog/when-to-declare-classes-final/.

Кнуты и плётки:
- в PHP-CS-Fixer включаем final фиксер;
- для PHP CodeSniffer ставим нюхача https://github.com/matthewbdaly/abstract-or-final-sniff.

Как мокать:
- если над классом есть интерфейс, то мокать надо его, а не имплементацию;
- если это Entity или ValueObject, то лучше не мокать, а работать с полноценным экземпляром;
- в крайнем случае есть https://github.com/dg/bypass-finals. Как правильно его пристегнуть к PHPUnit: https://www.tomasvotruba.cz/blog/2019/03/28/how-to-mock-final-classes-in-phpunit/#4-single-hook.
ocramius.github.io When to declare classes final Declaring classes as final enhances our code quality and abstraction dramatically, but is it always correct?
  • ❤ 1
  • 🎃 1
Post #42 691
Сегодня наконец-то нашел нормальное объяснение, почему __toString лучше не использовать. Приводя объект к строке при помощи (string), мы можем забыть обработать null и получим на выходе '' вместо null. То есть еще один потенциальный способ выстрелить в ногу 🦵🔫.

Подробнее с примерами: https://github.com/ShittySoft/symfony-live-berlin-2018-doctrine-tutorial/pull/3#issuecomment-460441229.

На радостях заменил в проекте все приведения на $vo->toString(), убрал <ImplicitToStringCast errorLevel="suppress"/> в psalm.xml и удалил все методы __toString. Ну и конечно же функциональные тесты красные 🔴. Потому что Doctrine не умеет в ValueObject идентификаторы 😡. Конкретно на этой строке https://github.com/doctrine/orm/blob/2.7/lib/Doctrine/ORM/UnitOfWork.php#L1521 выполняется неявное приведение к строке 🤯.

Почирикал с @ocramius (https://twitter.com/vudaltsov/status/1201511202205163520). Он сказал, что приведение идентификаторов к примитивам через Type::convertToDatabaseValue хорошая идея, но может значительно сказаться на производительности.

В итоге пришлось вернуть __toString() {Entity}Id классам.

Выводы:
- Psalm & ImplicitToStringCast — 👍🔥,
- __toString — 👎 (но будьте внимательны в местах взаимодействия с инфраструктурой),
- функциональные тесты — 😘🎉.
GitHub Value types/value objects - use clearly defined types for anything that would otherwise be a scalar or composition of scalars by… This patch introduces value objects into the mix. What we did is isolating these concepts into these specific well-defined data structures, which would otherwise be strings, and therefore prone to ...
Post #41 565
Всем привет! Не спешите отписываться)

Переименовал канал, чтобы не начинать с нуля 😂
@llakie, надеюсь, ты на меня не обидишься ☺️

Буду рассказывать про PHP, Symfony, DDD, CQRS, EDA и прочие модные баззворды.
Post #40
Channel name was changed to «Валентин Удальцов»
Post #39
Channel photo updated
Post #38 686
Мой второй PR с хакатона в новостях в числе других улучшений форм 🌋

https://symfony.com/blog/new-in-symfony-4-3-more-form-improvements

Также вчера увидела свет первая бета-версия Symfony 4.3.0 🚀
Полный спискок нововведений: https://symfony.com/blog/symfony-4-3-0-beta1-released
Symfony New in Symfony 4.3: More Form improvements (Symfony Blog) Symfony 4.3 will include many new features to improve the Symfony Forms, such as row attributes, custom errors in data mappers and a better form debug command.
Post #37 1.27K
Расписание PHP Russia 2019.pdf567.8 KB
Опубликовано расписание PHP Russia 2019!

Мой митап «Как контрибьютить в Symfony и зачем это делать» пройдет 17 мая в 16:00 в зале S.
Post #36 641
Огромное спасибо @petrmyazin за идею и всем остальным за веру в меня 🤗
Post #35 628
Ура! Мой митап утвердили 🥳

Ну что ж, тогда я жду вас всех 17 мая на PHP Russia!
Post #33 650
Кому интересно пообщаться со мной вживую и узнать, как контрибьютить в Symfony и зачем это делать, приглашаю проголосовать за мой митап на сайте конференции PHP Russia!

https://phprussia.ru/2019/meetups

Что вас ждет на митапе:
- рассказ об моем участии в международной конференции Symfony Con и закрытом хакатоне в Брюсселе,
- воркшоп по созданию пулл-реквестов в Symfony (о ветках, релизах, ребейзах, форс-пушах и ожидании ответа),
- культура общения в экосистеме Symfony (diversity),
- ответ на вопрос, как активность в открытых проектах PHP поможет лично вам.
phprussia.ru Крупнейшая конференция по PHP в России 2019: Митапы Митапы на конференции.
Post #31 608
И следом вторая часть с техническими подробностями совместно проделанной работы.

https://5minphp.ru/episode51/

Большое спасибо Петру за интервью, присоединяйтесь к пятиминутке в Телеграме @tg_5minphp, Твиттере https://twitter.com/5minphp и на сайте https://5minphp.ru/.
Пятиминутка PHP Symfony Hackathon в деталях — issues и pull requests Продолжаем рассказ про The Symfony and API Platform Hackathon, который проходил в Брюсселе 6 и 7 апреля 2019. В этом выпуске Валентин раскрывает технические подробности тех issues и pull requests, …
Post #30 626
Post #29 625
Создатель Symfony, Fabien Potencier
  • 👍 1
Post #26 548
  • 🔥 1
Post #24 577
Час назад Фабьен смерджил мой PR https://github.com/symfony/symfony/pull/30862

Суть его проста: выделить функционал твиговских функций absolute_url() и relative_path в отдельный сервис HttpFoundation\UrlHelper. Его можно использовать при генерации ссылок на локальные ресурсы, что нередко требуется в API и при отправке писем.

Допустим, у нас есть сущность User@Entity с полем string $avatar = 'uploads/nadezhda.jpg'. После нормализации нам бы хотелось получить ['avatar' => 'https://website.ru/uploads/nadezhda.jpg']. Теперь это можно сделать одним вызовом $this->urlHelper->getAbsoluteUrl($user->avatar()).

Важно, что UrlHelper работает вне контекста запроса, например, в командах, так как при пустом RequestStack он берет данные из RequestContext. Подробнее о том, как настроить RequestContext, можно прочитать здесь: https://symfony.com/doc/current/console/request_context.html .
GitHub [HttpFoundation] Add AbsoluteUrlGeneratorInterface and RelativePathGeneratorInterface by vudaltsov · Pull Request #30862 · symfony/symfony Q A Branch? master Bug fix? no New feature? yes BC breaks? no Deprecations? yes Tests pass? yes Fixed tickets n/a License MIT Doc PR todo I noticed that I need to generate ab...
  • 👍 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →