Месяц назад вышел PHP 8.1 с новыми возможностями. Атрибуты теперь поддерживают вложенность, которой раньше не было. Это нам мешало перейти на них в 8.0. И не все библиотеки поддерживали атрибуты. Теперь же всё поддерживается и нас ничто не останавливает.
Пришла пора завершить переход на PHP 8.0 и перевести проект с классических аннотаций на новые нативные атрибуты для валидатора и Doctrine ORM. Поговорить, что делать с ними в legacy-проектах. И заодно обновиться на новые компоненты из версии Symfony 6 для бэкенда и подключить новый React Router 6 для фронтенда.
- 00:00:33 Атрибуты в PHP 8
- 00:07:03 Обновление фронтенда
- 00:08:53 Переход на React Router 6
- 00:13:25 Новые версии Cucumber
- 00:15:02 Исправление закрытия браузера в E2E
- 00:16:39 Увеличение таймаутов в E2E
- 00:17:48 Регулировка числа потоков
- 00:19:08 Версия Xdebug
- 00:19:55 Обновление API
- 00:24:58 Валидатор из Symfony 6
- 00:26:38 Дополнительный тест на валидацию
- 00:27:51 Восстановление валидации по аннотациям
- 00:31:58 Перевод валидатора на атрибуты
- 00:33:35 Перевод Doctrine ORM на атрибуты
- 00:39:49 Драйвер для чтения атрибутов
- 00:42:53 Донастройка CS Fixer
- 00:43:14 Переход на атрибуты в legacy проекте
- 00:49:20 Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков.
Открыть →Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram
Спасибо!
Добрый вечер, Дмитрий.
Как всегда на отлично)
Сразу же вопрос.
Есть всё-таки возможность поставить overtrue/phplint к symfony6.0? Если да, то как это можно делать?
Или забить на это и ждать пока обновится сам overtrue/phplint на использование symfony/console v6.0?
Вчера пытался найти посвежее пакет phplint, но пока ничего не попалось.
Или отправить Pull Request и не ждать.
Понял.
И вот ещё такая проблема.
После обновлений появилась ошибка
Пробовал в конфигурации nginx для frontend и gateway задать настройки
Но это не помогло.
Как ещё можно решить данную проблему?
Для
location /ws {...}
в проксировании настроить заголовок Connection.То есть, нужно создать для ws отдельный блок в настройках nginx, так же как делали для sockjs-node?
Да
А где поискать, как понять, какое именно обновление вызвало этот сбой?
В CHANGELOG пакетов, у которых были мажорные изменения.
Ошибка возникла после обновления react-scripts 4.0.3 -> 5.0.0
На github есть issues
К сожалению не помогает.
Добавил в frontend/docker/development/nginx/conf.d и в gateway/docker/development/nginx/conf.d, но ошибка всё-равно появляется.
Ругается на файл
строка 13
11 дней назад уже сделал такой PR. 4 дня назад выпустили версию 4.1 где есть поддержка Symfony 6. Пользуйтесь)
Спасибо.
Благодарю Дмитрий, даже я понял про атрибуты.
Интересно, несовместимость каких текущих пакетов помешала Вам прыгнуть сразу на PHP 8.1 ?
Традиционные вопросы чайника:
Какие папки мы вправе указывать как metadata_dirs для доктрины?
Пару недель назад были мелкие проблемы у PHP-CS-Fixer, которые уже исправили. Сейчас есть deprecations у пакета willdurand/negotiation.
А так в любом проекте можно посмотреть явно мешающие пакеты командой:
Для проверки реальной совместимости можно попробовать в локальном
Dockerfile
иcomposer.json
поменять версию и после пересборки запуститьapi-check
.Но помимо смены версии желательно и код перевести на новые возможности вроде
readonly
и Enums. Так что для перехода на PHP 8.1 нужен будет отдельный подробный эпизод.👍
PS: Ребята, осторожно. в 8.1 задепрекейтили кучу функций Я напоролся в продакшене :)
Именно. В своём коде это всё находит Psalm, но в коде чужих библиотек могут быть проблемы.
К сожалению, Psalm найдёт только если разработчик сам поставил deprecated в аннотации в докблоке своего кода.
А просто deprecated функции или куски кода в голом PHP он не находит.
Ранее у phpstan был плагин для поиска подобных вещей, но он давно не обновляется, так что сейчас в опенсорсе, наверное, и нет ничего, для поиска deprecated кода.
Можем. Рекурсивно ищет.
Может быть мусор, как у нас там лежат классы типов и репозиториев.
Благодарю! Тогда в чем фишка это фишки? При каких обстоятельтвах мы вынуждены будем указывать в массиве конфига кучу отдельных папок для Entity вместо просто одной папки?
У нас ни в чём, так как мэппинг везде одинаковый. Можно и так, и так.
Нам бы сейчас отдельные папки помогли постепенно модуль за модулем перевести с аннотаций на атрибуты большой проект.
Значит на производительность не повлияет указание одного src - Отлично!
Очень ценю Ваши ответы Дмитрий! 👊
После обновления react-scripts 4.0.3 -> 5.0.0 возникла ошибка:
Решается заменой в конфигах nginx
на
И добавлением в environment для frontend-node переменной
Без этой переменной не работает.
Ошибка больше в консоли не появлялась, "горячая" перезагрузка страницы работает.
Возможно кому-то поможет.
Спасибо!
Дима, когда примерно будет продолжение серии по Slim/React?
Спасибо, и есть вопрос по атрибутам, в проекте по Symfony для swagger`а использовались аннотации, а как такие же анотации перевести в атрибуты? вот пример из вашего проекта используется php 8.1
Аналогично, но с ключами вроде
parameters
иresponses
:понял, спасибо большое, к примеру выходит как то так
еще вопрос, phpStorm начиная с new OAT\Response подсвечивает все красным, однако код работает и документацию делает правильно и я не нашел плагинов которые бы ему объяснили что все норм
Вопрос отпал сам собой, оказывается phpstorm 2021.2 так не умел, обновился до .3 и все отлично!
Добрый день, заметил, что при переходе на атрибуты, правило final_class для php cs fixer перевело классы сущностей в final, так как в этой проверке настроено определение entity при помощи phpDoc. На dev окружение проблем с этим нет, но на prod сервере будет ошибка при создании прокси объектов. Чтобы не отключать это правило, у себя добавил к этим классам @final. Может стоит добавить какую-то проверку в make check, чтобы она проверяла такие возможны ошибки
Да, есть у них пока такой баг. Может в скором времени исправят.
Прокси-объекты создаются если в проекте мы из одной сущности лениво подгружаем
ManyToOne
связь вроде$comment->author
или если в зависимых фикстурах используетсяgetReference
. У нас таких внешних связей не будет, так что намfinal
не помешает.Или войти через: