Рассказал о хакатоне на пятиминутке PHP!
Подробно об организации, впечатлениях, коммуникации и моих достижениях.
https://5minphp.ru/episode50/
Подробно об организации, впечатлениях, коммуникации и моих достижениях.
https://5minphp.ru/episode50/
Пятиминутка PHP
Symfony Hackathon в Брюсселе глазами очевидца
6 и 7 апреля 2019 в Брюсселе прошел The Symfony and API Platform Hackathon. В этом выпуске подкаста, один из участников, Валентин Удальцов, делится своими впечатлениями, об орагнизации, о процессе …
И следом вторая часть с техническими подробностями совместно проделанной работы.
https://5minphp.ru/episode51/
Большое спасибо Петру за интервью, присоединяйтесь к пятиминутке в Телеграме @tg_5minphp, Твиттере https://twitter.com/5minphp и на сайте https://5minphp.ru/.
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, …
Получил свой первый бейдж уровня Hard ⭐⭐⭐
https://connect.symfony.com/badge/140/eu-fossa-hackathon-2019-contributor
https://connect.symfony.com/badge/140/eu-fossa-hackathon-2019-contributor
Кому интересно пообщаться со мной вживую и узнать, как контрибьютить в Symfony и зачем это делать, приглашаю проголосовать за мой митап на сайте конференции PHP Russia!
https://phprussia.ru/2019/meetups
Что вас ждет на митапе:
- рассказ об моем участии в международной конференции Symfony Con и закрытом хакатоне в Брюсселе,
- воркшоп по созданию пулл-реквестов в Symfony (о ветках, релизах, ребейзах, форс-пушах и ожидании ответа),
- культура общения в экосистеме Symfony (diversity),
- ответ на вопрос, как активность в открытых проектах PHP поможет лично вам.
https://phprussia.ru/2019/meetups
Что вас ждет на митапе:
- рассказ об моем участии в международной конференции Symfony Con и закрытом хакатоне в Брюсселе,
- воркшоп по созданию пулл-реквестов в Symfony (о ветках, релизах, ребейзах, форс-пушах и ожидании ответа),
- культура общения в экосистеме Symfony (diversity),
- ответ на вопрос, как активность в открытых проектах PHP поможет лично вам.
phprussia.ru
Крупнейшая конференция по PHP в России 2019: Митапы
Митапы на конференции.
Расписание 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, организация и впечатления?Как принять …
