И в продолжение темы тестирования. Доклад про то, почему интеграционные тесты — жульничество. Почему их количество всегда растет, а качество проекта при этом падает. Как правильно писать изолированные (юнит-) тесты и как тестировать контракты.
Намеренно не расписываю тайм-коды, потому что этот доклад представляет собой цельное повествование от проблемы до решения.
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…
В недавно вышедшей Symfony 5.0 появилась компонента String.
Актуальный обзор в сегодняшней новости: https://symfony.com/blog/new-in-symfony-5-0-string-component.
Документация: https://symfony.com/doc/current/components/string.html.
Документация по использованию в Twig: https://twig.symfony.com/doc/2.x/filters/u.html.
Наглядная презентация идеи от автора библиотеки Николаса: https://speakerdeck.com/nicolasgrekas/symfony-string-flexible-handling-of-unicode.
#PHP #Symfony
Актуальный обзор в сегодняшней новости: https://symfony.com/blog/new-in-symfony-5-0-string-component.
Документация: https://symfony.com/doc/current/components/string.html.
Документация по использованию в Twig: https://twig.symfony.com/doc/2.x/filters/u.html.
Наглядная презентация идеи от автора библиотеки Николаса: https://speakerdeck.com/nicolasgrekas/symfony-string-flexible-handling-of-unicode.
#PHP #Symfony
Symfony
New in Symfony 5.0: String Component (Symfony Blog)
Symfony 5.0 introduces a new String component which deals with bytes, UTF-8 code points and grapheme clusters in a unified way, provides an object-oriented API for strings, and includes a slugger.
Помог обновить https://github.com/dunglas/doctrine-json-odm для совместимости с Symfony 5. Кто юзает этот замечательный пакет, апайте до 1.0.1.
Как правило, такие PR тривиальны и занимают до получаса времени. Позитивный сценарий:
• форкаем и клонируем репозиторий;
• добавляем в
•
• запускаем локально тесты либо сразу создаем PR и ждем результатов CI;
• попутно могут возникнуть какие-то мелочи, смотрите мой https://github.com/dunglas/doctrine-json-odm/pull/83.
Призываю вас участвовать в обновлении используемых вами пакетов. Это элементарный способ законтрибьютить, поближе познакомитьсся с кодом и авторами да и просто получить 🟩 в карму на GitHub.
#OSS #Contributing #Symfony
Как правило, такие PR тривиальны и занимают до получаса времени. Позитивный сценарий:
• форкаем и клонируем репозиторий;
• добавляем в
composer.json к пакетам symfony/* версии || ^5.0 ;•
composer update;• запускаем локально тесты либо сразу создаем PR и ждем результатов CI;
• попутно могут возникнуть какие-то мелочи, смотрите мой https://github.com/dunglas/doctrine-json-odm/pull/83.
Призываю вас участвовать в обновлении используемых вами пакетов. Это элементарный способ законтрибьютить, поближе познакомитьсся с кодом и авторами да и просто получить 🟩 в карму на GitHub.
#OSS #Contributing #Symfony
GitHub
GitHub - dunglas/doctrine-json-odm: An object document mapper for Doctrine ORM using JSON types of modern RDBMS.
An object document mapper for Doctrine ORM using JSON types of modern RDBMS. - dunglas/doctrine-json-odm
Мета-вопросы а-ля "Можно спросить?" или "Ребят, есть вопрос по %technology%" усложняют общение в онлайне. Спрашивайте сразу по делу. Это не про вежливость — это про уважение к чужому времени. Нет глупых вопросов, есть бесполезные предисловия.
https://nometa.xyz/
https://nometa.xyz/
Крутая статья про контринтуитивный парсинг JSON. Ценность её не только в исследовании причины невалидности выражения
Я был бы счастлив прочитать такую статью несколько лет назад, перед тем как написать свой первый кастомный тег для Twig и DQL функцию для Doctrine ORM.
https://nullprogram.com/blog/2019/12/28/
[01], но и в ёмком экскурсе в парсеры на примере формата, который знают все.Я был бы счастлив прочитать такую статью несколько лет назад, перед тем как написать свой первый кастомный тег для Twig и DQL функцию для Doctrine ORM.
https://nullprogram.com/blog/2019/12/28/
Внезапно узнал, что можно передавать массив искомых значений в аргументе
Пример:
В документации можно найти на странице https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#by-simple-conditions по фразе If you pass an array of values.
Надеюсь, в отличие от меня вы и так это знали и не создавали почем зря query builder.
$criteria метода EntityRepository::findBy(). Он автоматически будет преобразован в выражение IN(...).Пример:
$em->getRepository(Question::class)->findBy([
'id' => [
'82f06c7f-7513-464d-972d-857fb169f86a',
'25ee6a8d-72b8-449f-9409-cdb545b28f5b',
],
]);
В документации можно найти на странице https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#by-simple-conditions по фразе If you pass an array of values.
Надеюсь, в отличие от меня вы и так это знали и не создавали почем зря query builder.
Наконец-то могу поделиться своим докладом на SymfonyCon Amsterdam 2019.
https://symfonycasts.com/screencast/symfonycon2019/how-to-contribute-to-symfony-and-why-you-should-give-it-a-try
https://symfonycasts.com/screencast/symfonycon2019/how-to-contribute-to-symfony-and-why-you-should-give-it-a-try
Symfonycasts
How to contribute to Symfony and why you should give it a try (Valentin Udaltsov)
***TIP SymfonyCon 2019 Amsterdam presentation by [Valentin Udaltsov](https://connect.symfony
Друзья, приглашаю к себе в команду Middle/Senior разработчиков!
Москва, Южная/Чертановская, полный рабочий день, 140-220к.
Предметная область — анализ вовлеченности и лояльности сотрудников.
У нас PHP 7.4, Symfony 5, PostgreSQL, CQRS, DDD, event-driven архитектура и unit-тесты.
От кандидата ждем уверенного владения PHP 7.x, ООП, SQL и понимания вышеупомянутых концепций.
Подробнее на странице вакансии https://happy-job.ru/vacancy-super-php-2020-02.
Можете писать мне в ЛС.
На фото наш техотдел 🤗
Москва, Южная/Чертановская, полный рабочий день, 140-220к.
Предметная область — анализ вовлеченности и лояльности сотрудников.
У нас PHP 7.4, Symfony 5, PostgreSQL, CQRS, DDD, event-driven архитектура и unit-тесты.
От кандидата ждем уверенного владения PHP 7.x, ООП, SQL и понимания вышеупомянутых концепций.
Подробнее на странице вакансии https://happy-job.ru/vacancy-super-php-2020-02.
Можете писать мне в ЛС.
На фото наш техотдел 🤗
Вышел первый пакет Yii3
Принцип именования: исключение должно само иметь "Human understandable name", а не имплементировать лишний метод
Принцип разделения интерфейсов. Метод
Помимо этого интерфейс почему-то не наследует
В целом пакет выглядит бесполезным без обработчика этого самого
yiisoft/friendly-exception. Он состоит из одного интерфейса https://github.com/yiisoft/friendly-exception/blob/master/src/FriendlyExceptionInterface.php, который нарушает как минимум два принципа.Принцип именования: исключение должно само иметь "Human understandable name", а не имплементировать лишний метод
getName(). Имя класса — это и есть главное название, а для дополнительной информации предусмотрен стандартный метод getMessage().Принцип разделения интерфейсов. Метод
public function getSolution(): ?string обуза, потому что при имплементации интерфейса без предполагаемого решения придется добавлять плейсхолдер return null. Вместо этого правильнее было сделать отдельный интерфейс с сигнатурой без null, например:interface SolutionAwareExceptionInterface extends Throwable
{
public function getSolution(): string;
}
Помимо этого интерфейс почему-то не наследует
Throwable, что позволяет использовать его вне контекста исключений. Хорошая практика — максимально ограничивать контекст использования для предотвращения выстрелов в ногу.В целом пакет выглядит бесполезным без обработчика этого самого
FriendlyException. Это интерфейс ради интерфейса. Задача, которую он якобы решает, настолько тривиальна, что при необходимости проще решить её в приложении самому, чем тащить еще одну библиотеку.GitHub
friendly-exception/src/FriendlyExceptionInterface.php at master · yiisoft/friendly-exception
An interface for an exception to be friendly. Contribute to yiisoft/friendly-exception development by creating an account on GitHub.
В Symfony тоже спорную фичу добавили: https://symfony.com/blog/new-in-symfony-5-1-autowire-public-typed-properties.
Публичные свойства хороши в DTO, но в сервисах они — зло! Сервисы должны быть инкапсулированы, зависимости в них не должны меняться после инициализации. Не стоит пользоваться этой новой фичей, она очевидный антипаттерн.
Прокидывайте сервисы по классике через конструктор в приватные поля и следите за тем, чтобы инъекций было не больше трех, а в идеале ноль или одна.
Публичные свойства хороши в DTO, но в сервисах они — зло! Сервисы должны быть инкапсулированы, зависимости в них не должны меняться после инициализации. Не стоит пользоваться этой новой фичей, она очевидный антипаттерн.
Прокидывайте сервисы по классике через конструктор в приватные поля и следите за тем, чтобы инъекций было не больше трех, а в идеале ноль или одна.
Symfony
New in Symfony 5.1: Autowire public typed properties (Symfony Blog)
In Symfony 5.1, public properties typed with classes related to services are autowired automatically, which is equivalent to the traditional setter injection.
В PHP 8 появится функция get_debug_type.
Вместо
Но необязательно ждать релиза PHP 8 — можно установить полифил от Symfony и пользоваться функцией в PHP 7.x!
Вместо
is_object($value) ? get_class($value) : gettype($value) можно будет писать get_debug_type($value). Полезно, например, для исключений:throw new InvalidArgumentException(sprintf('Expected string, got %s', get_debug_type($arg)));Но необязательно ждать релиза PHP 8 — можно установить полифил от Symfony и пользоваться функцией в PHP 7.x!
composer req symfony/polyfill-php80GitHub
GitHub - symfony/polyfill-php80: Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions
Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions - symfony/polyfill-php80
Пых — блог Валентина Удальцова о разработке на PHP.
На канале не размещается реклама и вакансии.
Полезные ссылки:
• основной чат канала Пыхтелка,
• чат Пыхтелка Symfony,
• канал на YouTube PHPPoint,
• канал с мемами PHP умирает?!,
• пост про мои консультации,
• статистика канала на Telegram Analytics,
• Patreon.
На канале не размещается реклама и вакансии.
Полезные ссылки:
• основной чат канала Пыхтелка,
• чат Пыхтелка Symfony,
• канал на YouTube PHPPoint,
• канал с мемами PHP умирает?!,
• пост про мои консультации,
• статистика канала на Telegram Analytics,
• Patreon.
Telegram
Валентин Удальцов
Автор канала Пых @phpyh. Делаю Пых.конф — новую PHP конференцию для всех 19 сентября в Конгресс-центре ЦМТ!
🔥1
В Psalm скоро появятся условные типы как в TypeScript.
Поиграться можно тут: https://psalm.dev/r/5fb0ea4228 .
Источник: https://twitter.com/psalmphp/status/1241744682494971904 .
Подробнее в issue: https://github.com/vimeo/psalm/issues/3005 .
/**
* @template T as string|list<string>
* @psalm-param T $name
* @psalm-return (T is string ? Connection : array<string, Connection>)
*/
public function getConnection($name) {
// ...
}
Поиграться можно тут: https://psalm.dev/r/5fb0ea4228 .
Источник: https://twitter.com/psalmphp/status/1241744682494971904 .
Подробнее в issue: https://github.com/vimeo/psalm/issues/3005 .
Twitter
Psalm
Quarantine update: was bored, so decided to implement TypeScript's conditional types in Psalm. You can play with the prototype here: https://t.co/Roc7rm90Ao
Вышла новая мажорная версия популярной библиотеки ramsey/uuid. Из описания следует, что серьезных нарушений обратной совместимости в ней нет, а вот новых интерфейсов и исключений там целый список.
Изучаем изменения в документации и обновляемся
На мой взгляд, самое интересное — это поддержка пока нестандартизированного UUID v6. Новая версия UUID предложена специально для использования в качестве первичного ключа БД и обладает следующими свойствами:
- Сортировка по необработанным байтам приводит к последовательности, эквивалентной сортировке по встроенной временной метке.
- Встроенное время может быть извлечено для использования в качестве времени создания.
- Глобальная уникальность, которая является основным требованием для всех типов UUID.
Про отличия версии 6 от версии 1 и другие подробности можно прочитать в IETF черновике.
Изучаем изменения в документации и обновляемся
composer req ramsey/uuid:^4.0.На мой взгляд, самое интересное — это поддержка пока нестандартизированного UUID v6. Новая версия UUID предложена специально для использования в качестве первичного ключа БД и обладает следующими свойствами:
- Сортировка по необработанным байтам приводит к последовательности, эквивалентной сортировке по встроенной временной метке.
- Встроенное время может быть извлечено для использования в качестве времени создания.
- Глобальная уникальность, которая является основным требованием для всех типов UUID.
Про отличия версии 6 от версии 1 и другие подробности можно прочитать в IETF черновике.
GitHub
Release 4.0.0 · ramsey/uuid
Read the upgrade guide for details on how these changes may impact your code and what you can do to ease the upgrade process.
Added
Add support for version 6 UUIDs, as defined by http://gh.peabod...
Added
Add support for version 6 UUIDs, as defined by http://gh.peabod...
Чтобы узнать, какие пакеты пора обновить, используем команду
Желтым будут выделены зависимости, которые обновились в мажорной версии. В соответствии с правилами семантического версионирования мажорный релиз допускает нарушение обратной совместимости. Это означает, что обновление такого пакета потребует времени — нужно будет почитать заметки к релизу, проверить все сценарии и места использования и скорее всего покодить. Не стоит сразу накидываться на новые мажорные версии — пусть настоятся, получат свои хотфиксы.
Красным будут выделены зависимости, которые обновились в минорной или патч версиях. Такие релизы не должны нарушать обратной совместимости, при условии, конечно, что авторы библиотек знают про принципы версионирования. Патчи рекомендую накатывать сразу — скорее всего они содержат багфиксы или закрывают уязвимости. Минорные апдейты, как правило, содержат новые фичи и депрекации старых. Тут обновляемся по вкусу, но тоже лучше не затягивать, иначе потом все за один присест придется осваивать.
Чтобы скрыть мажорные апдейты (наличие которых форсирует желтый цвет даже если пакет в текущем мажоре получил патч), используем флаг
Про остальные флаги и другие полезные команды читаем в официальной документации Composer.
composer outdated или просто composer out.Желтым будут выделены зависимости, которые обновились в мажорной версии. В соответствии с правилами семантического версионирования мажорный релиз допускает нарушение обратной совместимости. Это означает, что обновление такого пакета потребует времени — нужно будет почитать заметки к релизу, проверить все сценарии и места использования и скорее всего покодить. Не стоит сразу накидываться на новые мажорные версии — пусть настоятся, получат свои хотфиксы.
Красным будут выделены зависимости, которые обновились в минорной или патч версиях. Такие релизы не должны нарушать обратной совместимости, при условии, конечно, что авторы библиотек знают про принципы версионирования. Патчи рекомендую накатывать сразу — скорее всего они содержат багфиксы или закрывают уязвимости. Минорные апдейты, как правило, содержат новые фичи и депрекации старых. Тут обновляемся по вкусу, но тоже лучше не затягивать, иначе потом все за один присест придется осваивать.
Чтобы скрыть мажорные апдейты (наличие которых форсирует желтый цвет даже если пакет в текущем мажоре получил патч), используем флаг
--minor-only (-m).Про остальные флаги и другие полезные команды читаем в официальной документации Composer.
Semantic Versioning
Semantic Versioning 2.0.0
Semantic Versioning spec and website
Теперь у Symfony тоже есть библиотека для работы с UUID:
ramsey/uuid
- процесс генерации реализован прямо в библиотеке и разложен по ООП полочкам, легко расширяется;
- поддержка GUID;
- поддержка экспериментального UUID v6;
- интеграции: ramsey/uuid-doctrine , ramsey/uuid-console .
symfony/uid
- элементарная обёртка над полифилом symfony/polyfill-uuid, который имитирует функционал PHP-расширения UUID и при этом работает быстрее;
- поддержка UUID v6;
- поддержка ULID;
- обсуждаются планы по интеграции с другими компонентами и библиотеками.
Как только допилят интеграцию, можно будет в новых проектах ставить
____
Есть недовольные, мол, Symfony продолжает добавлять компоненты, которые заменяют существующие неплохие проекты. Возможно, имеется в виду
Мое мнение, что если пакет лицензирован MIT, то по определению ни у кого не должно быть никаких претензий к тем, кто создает похожие библиотеки.
Во-вторых, Symfony не всегда делает хорошо, например, к тому же Messenger и другим компонентам немало вопросов по архитектуре. Разработки Symfony никак не блокируют стремление к прекрасному, скорее стимулируют. Да и в целом конкуренция — это почти всегда хорошо, она препятствует застою, предоставляет выбор. Может быть Ben Ramsey не релизнул бы 4.0 еще полгода, если бы Symfony не анонсировала свой UID 😉
composer req symfony/uid. Сравним.ramsey/uuid
- процесс генерации реализован прямо в библиотеке и разложен по ООП полочкам, легко расширяется;
- поддержка GUID;
- поддержка экспериментального UUID v6;
- интеграции: ramsey/uuid-doctrine , ramsey/uuid-console .
symfony/uid
- элементарная обёртка над полифилом symfony/polyfill-uuid, который имитирует функционал PHP-расширения UUID и при этом работает быстрее;
- поддержка UUID v6;
- поддержка ULID;
- обсуждаются планы по интеграции с другими компонентами и библиотеками.
Как только допилят интеграцию, можно будет в новых проектах ставить
symfony/uid просто из-за скорости работы.____
Есть недовольные, мол, Symfony продолжает добавлять компоненты, которые заменяют существующие неплохие проекты. Возможно, имеется в виду
symfony/messenger, который оставил в тени simple-bus/simple-bus.Мое мнение, что если пакет лицензирован MIT, то по определению ни у кого не должно быть никаких претензий к тем, кто создает похожие библиотеки.
Во-вторых, Symfony не всегда делает хорошо, например, к тому же Messenger и другим компонентам немало вопросов по архитектуре. Разработки Symfony никак не блокируют стремление к прекрасному, скорее стимулируют. Да и в целом конкуренция — это почти всегда хорошо, она препятствует застою, предоставляет выбор. Может быть Ben Ramsey не релизнул бы 4.0 еще полгода, если бы Symfony не анонсировала свой UID 😉
