Суперподробный чит-шит по 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…
В недавно вышедшей 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-php80
GitHub
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
Валентин Удальцов
Я обязательно исправлюсь в следующей жизни.
В 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