Расписание PHP Russia 2019.pdf
567.8 KB
Опубликовано расписание PHP Russia 2019!
Мой митап «Как контрибьютить в Symfony и зачем это делать» пройдет 17 мая в 16:00 в зале S.
Мой митап «Как контрибьютить в Symfony и зачем это делать» пройдет 17 мая в 16:00 в зале S.
Мой второй 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
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.
Сегодня наконец-то нашел нормальное объяснение, почему
Подробнее с примерами: https://github.com/ShittySoft/symfony-live-berlin-2018-doctrine-tutorial/pull/3#issuecomment-460441229.
На радостях заменил в проекте все приведения на
Почирикал с @ocramius (https://twitter.com/vudaltsov/status/1201511202205163520). Он сказал, что приведение идентификаторов к примитивам через
В итоге пришлось вернуть
Выводы:
- Psalm & ImplicitToStringCast — 👍🔥,
-
- функциональные тесты — 😘🎉.
__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 ...
What we did is isolating these concepts into these specific well-defined data structures, which would otherwise be strings, and therefore prone to ...
Класс должен быть либо абстрактным, либо финальным.
Мотивация:
- 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 включаем
- для 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.
Мотивация:
- 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
Надеюсь, все знают, что начиная с Symfony 4.1 можно инлайнить конфигурацию роутов в путь.
Если вдруг нет, читайте новость от 22 марта прошлого года: https://symfony.com/blog/new-in-symfony-4-1-inlined-routing-configuration. Или ищите в документации https://symfony.com/doc/current/routing.html по слову
Но что если у нас UUID? Не указывать же каждый раз этот гигантский Regex!
Тут нам приходят на помощь параметры контейнера.
Подробнее тут: https://symfony.com/doc/4.2/routing/service_container_parameters.html (страница доступна только для 4.2, потому что документацию сейчас реструктуризируют).
То есть вместо
@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.
Записали на Пятиминутке PHP два подкаста.
https://5minphp.ru/episode72/ про
- прошедшую SymfonyCon Amsterdam и мой доклад,
- результаты Hack Day,
- Symfony Messenger,
- события предметной области,
- Symfony 5/6.
https://5minphp.ru/episode73/ про
- SymfonyCloud,
- более удобную разработку с Docker на маке,
- надежную отправку/доставку сообщений с RabbitMQ (https://vimeo.com/111998645),
- статический анализ кода при помощи Psalm и других инструментов.
Всех приглашаю послушать!
https://5minphp.ru/episode72/ про
- прошедшую SymfonyCon Amsterdam и мой доклад,
- результаты Hack Day,
- Symfony Messenger,
- события предметной области,
- Symfony 5/6.
https://5minphp.ru/episode73/ про
- SymfonyCloud,
- более удобную разработку с Docker на маке,
- надежную отправку/доставку сообщений с RabbitMQ (https://vimeo.com/111998645),
- статический анализ кода при помощи Psalm и других инструментов.
Всех приглашаю послушать!
Пятиминутка PHP
SymfonyCon 2019, Domain Events и новые компоненты Symfony 5
В этом выпуске Валентин Удальцов расскажет про SymfonyCon 2019, где он выступал как докладчик, а также активный участник Hack Day! Как прошел SymfonyCon 2019, организация и впечатления?Как принять …
Чтобы быстро и красиво оформлять консольные команды в привычном стиле Symfony, рекомендую использовать поставляемый с библиотекой
https://symfony.com/doc/current/console/style.html
Symfony\Component\Console\Style\SymfonyStyle. У него куча хелперов почти на все случаи жизни.https://symfony.com/doc/current/console/style.html
Постоянно работаю с UUID, поэтому повесил https://plugins.jetbrains.com/plugin/8320-uuid-generator/ на
Ctrl+U.JetBrains Marketplace
UUID Generator - IntelliJ IDEs Plugin | Marketplace
UUID, ULID and CUID generator plugin for IntelliJ based IDEs.. For example : 123e4567-e89b-12d3-a456-426655440000. You will find it in the Generate popup -> Random...
Обновляем
Она покажет все доступные рецепты и возможные обновления.
https://github.com/symfony/flex/pull/562
#Symfony #Flex
symfony/flex до 1.6.0 и запускаем команду composer recipes!Она покажет все доступные рецепты и возможные обновления.
https://github.com/symfony/flex/pull/562
#Symfony #Flex
Суперподробный чит-шит по Symfony Messenger.
https://twitter.com/andreiabohner/status/1206422366143885312
#Symfony #Messenger
https://twitter.com/andreiabohner/status/1206422366143885312
#Symfony #Messenger
Twitter
Andréia Bohner
Symfony 4.4 Messenger Cheat Sheet https://t.co/LW7Sp5GNL7
Отчаянно рекомендую свежий доклад @ocramius про тестирование и обеспечение качества кода.
https://www.youtube.com/watch?v=8rdTSYljts4
Из него вы узнаете:
- про график "этап разработки / цена ошибки" (https://youtu.be/8rdTSYljts4?t=340),
- почему отдел QA не нужен (https://youtu.be/8rdTSYljts4?t=526),
- про архитектуру и Architecture Decision Record (https://youtu.be/8rdTSYljts4?t=990),
- почему важна типизация (https://youtu.be/8rdTSYljts4?t=1771),
- про Psalm (https://youtu.be/8rdTSYljts4?t=1844),
- о "Пирамиде Маслоу" проекта (https://youtu.be/8rdTSYljts4?t=3357),
- про инструменты тестирования и анализа кода.
Наверняка что-то забыл или не отметил, лучше смотрите целиком.
#PHP #Testing #QA
https://www.youtube.com/watch?v=8rdTSYljts4
Из него вы узнаете:
- про график "этап разработки / цена ошибки" (https://youtu.be/8rdTSYljts4?t=340),
- почему отдел QA не нужен (https://youtu.be/8rdTSYljts4?t=526),
- про архитектуру и Architecture Decision Record (https://youtu.be/8rdTSYljts4?t=990),
- почему важна типизация (https://youtu.be/8rdTSYljts4?t=1771),
- про Psalm (https://youtu.be/8rdTSYljts4?t=1844),
- о "Пирамиде Маслоу" проекта (https://youtu.be/8rdTSYljts4?t=3357),
- про инструменты тестирования и анализа кода.
Наверняка что-то забыл или не отметил, лучше смотрите целиком.
#PHP #Testing #QA
YouTube
Aggressive PHP Quality Assurance in 2019 | Marco Pivetta
PHP has a reputation for being a very flexible, yet very messy programming language: Keeping the chaos at bay requires a non-trivial amount of cognitive load and technical expertise.
In this talk, we will explore how quality assurance for popular open source…
In this talk, we will explore how quality assurance for popular open source…
И в продолжение темы тестирования. Доклад про то, почему интеграционные тесты — жульничество. Почему их количество всегда растет, а качество проекта при этом падает. Как правильно писать изолированные (юнит-) тесты и как тестировать контракты.
Намеренно не расписываю тайм-коды, потому что этот доклад представляет собой цельное повествование от проблемы до решения.
https://vimeo.com/80533536 или https://www.youtube.com/watch?v=VDfX44fZoMc
#Testing #TDD
Намеренно не расписываю тайм-коды, потому что этот доклад представляет собой цельное повествование от проблемы до решения.
https://vimeo.com/80533536 или https://www.youtube.com/watch?v=VDfX44fZoMc
#Testing #TDD
Vimeo
J.B. Rainsberger - Integrated Tests Are A Scam
Integrated tests are a scam. You’re probably writing 2-5% of the integrated tests you need to test thoroughly. You’re probably duplicating unit tests…
