Пых
8.33K subscribers
183 photos
10 videos
4 files
481 links
Блог @vudaltsov о разработке на PHP.

Хобот: @phpyhobot
YouTube: https://youtube.com/@phpyh
VK Видео: https://vkvideo.ru/@phpyh
Мемы: https://t.me/isPHPdying
Статистика: https://t.me/INOTAROBOT?start=st1219340804

Реклама и вакансии НЕ размещаются.
Download Telegram
Отчаянно рекомендую свежий доклад @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://vimeo.com/80533536 или https://www.youtube.com/watch?v=VDfX44fZoMc

#Testing #TDD
В недавно вышедшей 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://github.com/dunglas/doctrine-json-odm для совместимости с Symfony 5. Кто юзает этот замечательный пакет, апайте до 1.0.1.

Как правило, такие PR тривиальны и занимают до получаса времени. Позитивный сценарий:
• форкаем и клонируем репозиторий;
• добавляем в composer.json к пакетам symfony/* версии || ^5.0 ;
composer update;
• запускаем локально тесты либо сразу создаем PR и ждем результатов CI;
• попутно могут возникнуть какие-то мелочи, смотрите мой https://github.com/dunglas/doctrine-json-odm/pull/83.

Призываю вас участвовать в обновлении используемых вами пакетов. Это элементарный способ законтрибьютить, поближе познакомитьсся с кодом и авторами да и просто получить 🟩 в карму на GitHub.

#OSS #Contributing #Symfony
Мета-вопросы а-ля "Можно спросить?" или "Ребят, есть вопрос по %technology%" усложняют общение в онлайне. Спрашивайте сразу по делу. Это не про вежливость — это про уважение к чужому времени. Нет глупых вопросов, есть бесполезные предисловия.

https://nometa.xyz/
Крутая статья про контринтуитивный парсинг JSON. Ценность её не только в исследовании причины невалидности выражения [01], но и в ёмком экскурсе в парсеры на примере формата, который знают все.

Я был бы счастлив прочитать такую статью несколько лет назад, перед тем как написать свой первый кастомный тег для Twig и DQL функцию для Doctrine ORM.

https://nullprogram.com/blog/2019/12/28/
Внезапно узнал, что можно передавать массив искомых значений в аргументе $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.
Однако, если вы хотите проиндексировать результирующий массив идентификаторами, без query builder не обойтись: потребуется метод indexBy.
Друзья, приглашаю к себе в команду 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.
Можете писать мне в ЛС.

На фото наш техотдел 🤗
Вышел первый пакет Yii3 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. Это интерфейс ради интерфейса. Задача, которую он якобы решает, настолько тривиальна, что при необходимости проще решить её в приложении самому, чем тащить еще одну библиотеку.
В Symfony тоже спорную фичу добавили: https://symfony.com/blog/new-in-symfony-5-1-autowire-public-typed-properties.

Публичные свойства хороши в DTO, но в сервисах они — зло! Сервисы должны быть инкапсулированы, зависимости в них не должны меняться после инициализации. Не стоит пользоваться этой новой фичей, она очевидный антипаттерн.

Прокидывайте сервисы по классике через конструктор в приватные поля и следите за тем, чтобы инъекций было не больше трех, а в идеале ноль или одна.
В PHP 8 появится функция get_debug_type.

Вместо 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
Channel photo updated
Channel name was changed to «Пых»
Пых — блог Валентина Удальцова о разработке на PHP.

На канале не размещается реклама и вакансии.

Полезные ссылки:
• основной чат канала Пыхтелка,
• чат Пыхтелка Symfony,
• канал на YouTube PHPPoint,
• канал с мемами PHP умирает?!,
пост про мои консультации,
статистика канала на Telegram Analytics,
Patreon.
В Psalm скоро появятся условные типы как в TypeScript.
/**
* @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 .