Всем привет! Краткий обзор новостей из мира PHP и Laravel за декабрь 2023 г от CutCode.
PHP Дайджест
Новости
Вышли PHP 8.1.27, PHP 8.2.14 и PHP 8.3.1
? Выпуски с исправлениями ошибок вышли по расписанию.
⛔️ Ветка PHP 8.1 прекратила активную поддержку и будет получать только обновления с исправлениями безопасности.
В этом большом обновлении представлена официальная версия AI Assistant, добавлена поддержка Pest и PHP 8.3, улучшена поддержка Symfony, улучшен интерфейс и многое другое.
Вышел Xdebug 3.3.0
В этом выпуске добавлена поддержка PHP 8.3, Flame-графиков и управляющих сокетов.
Современный сервер PHP-приложений, написанный на Go, позволяет создать PHP-сервер с помощью всего одной команды.
Laravel Octane в тестовом режиме уже поддерживает работу с FrankenPHP. Видеообзор - https://youtu.be/DgVLt7j8Nxo
Будущее PHP_CodeSniffer
Репозиторий с популярным пакетом для проверки кода PHP_CodeSniffer от компании Squizlabs объявлен устаревшим.
Дальнейшая разработка будет вестись в новом репозитории.
Состоялся последний релиз Twig 2
Как было объявлено в сентябре, Twig 2 больше не будет получать обновлений, пользователям рекомендуется обновиться до Twig 3.
Ядро PHP
Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:
? RFC: #[NotSerializable]
Max Semenik предлагает добавить новый атрибут `#[NotSerializable]` для предотвращения сериализации класса.
Это может помочь писать меньше кода и лучше анализироваться статическими анализаторами:
#[NotSerializable]
class MyClass
{
}
serialize(new MyClass()); // Exception: Serialization of 'MyClass' is not allowed
? RFC: Policy Repository
В настоящее время политики в отношении голосования по RFC, процесса выпуска, классификации безопасности и рекомендаций по именованию хранятся в разных местах.
Derick Rethans предлагает создать новый Git-репозиторий, чтобы собрать все политики в одном месте.
? RFC: Improve callbacks in ext/dom and ext/xsl
RFC, о котором мы говорили в прошлых выпусках, перешел в стадию голосования, которая продлится до 11 января 2024 года.
❌? RFC: Final anonymous classes
Отчасти из-за сложности постановки вопроса RFC был отклонен.
После получения обратной связи Daniil Gentili выбрал основное направление и предложил новую версию RFC: сделать все анонимные классы по умолчанию окончательными, предоставить необязательное ключевое слово `open`, чтобы сделать их неокончательными (как в Kotlin, `new open class {}`).
✅ RFC: Change how JIT is disabled by default
Еще один RFC из прошлого выпуска принят единогласно. PHP 8.4 будет поставляться с отключенным по умолчанию JIT, за счет установленной опции `opcache.jit=disable`, а значение опции `jit_buffer_size` по умолчанию будет увеличено до `64`.
В настоящее время JIT работает в режиме `tracing`, но по умолчанию отключен с помощью опции `opcache.jit_buffer_size=0`.
new MyClass()->method() без скобок!
Валентин Удальцов реализовал обращение к объектам, созданным через `new`, не оборачивая их в скобки.
Во избежание неоднозначности это будет работать только при наличии скобок аргументов конструктора.
Поддерживаются также динамические имена классов и анонимные классы.
Предложение ещё не оформлено в RFC, напишите в комментариях, как вы относитесь к такой реализации?
Laravel дайджест
Обновления Laravel
10.34. Метод ensure с несколькими типами
https://github.com/laravel/framework/pull/49127
Метод ensure(). Давайте напомню - этот метод проверяет каждый элемент коллекции на соответствие указанному типу. Если не соответствует, то мы получаем исключение. До этого апдейта мы могли указать только один тип, теперь же с помощью массива мы можем указывать несколько типов, все из которых будут доступны для элементов коллекции.
10.34. Метод missing для группы роутов
https://github.com/laravel/framework/pull/49144
Следующее нововведение из 10.34 затрагивает роуты и метод missing, который нам необходим для тех случаев, когда у нас Route отдаёт 404 ошибку и мы можем изменить response. До этого мы не могли работать в рамках этого метода через группы и нам приходилось для каждого роута в группе указывать одинаковые конструкции с этим методом. Теперь же работает и через группы и мы можем сразу для всей группы роутов указать поведение когда у нас роут выдал 404 исключение.
10.34.Правило валидации “Extensions”
https://github.com/laravel/framework/pull/49082
Это нововведение затрагивает форм реквесты, валидацию. До этого у нас было правило валидации mimes - проверка на соответствие mime-типа Теперь же появилось и правило-валидация более простое - extensions. Чтобы просто проверить расширение файла, соответствует ли оно указанному.
10.34. Alias Number class
https://github.com/laravel/framework/pull/49073
Нас ждёт ещё пара интересных нововведений - support-класс Number теперь обзавёлся и Alias. Давайте посмотрим на изменение. Оно простое, просто добавлен Alias под Number, чтобы мы могли его использовать без импортов. На канале кстати есть подробный обзор класса Number, он получился интересным. Там мы заглядывали под капот и смотрели каждый метод этого класса.
10.34. Conditionable трейт для TestResponse
https://github.com/laravel/framework/pull/49112
Последнее нововведение из релиза 10.34. Response объект, TestResponse обзавёлся также трейтом Conditionable, который теперь нам даёт возможность через метод по определённому условию добавлять методы тестирования Response и более удобно взаимодействовать с объектом.
10.35. Conditionable трейт для AssertableJson
https://github.com/laravel/framework/pull/49172
Перемещаемся к релизу 10.35, но не отходим от тестов. Тот же самый Трейт Conditionable также добавлен и к AssertableJson классу. Суть такая же - избавляемся от лишних if-конструкций и используем новый метод When.
10.35. Опция --with-secret для команды artisan down
https://github.com/laravel/framework/pull/49171
Следующее нововведение затрагивает Artisan-команду Down которая переключает наше приложение в режим технических работ и также добавлена опция --with-secret, которая у нас генерирует рандомный секретный ключ на основе stringable-объекта и метода Random. И нам в последующем чтобы выключить этот режим потребуется этот секретный код ввести.
10.35. Blade директива @use()
https://github.com/laravel/framework/pull/49179
Друзья и напоследок по 10.35. Всё-таки идеологию с Volt продолжают форсировать. До этого я как раз при обзоре Volt вам говорил о том, что больше всего меня бесит что приходится делать импорты через @php, @endphp, и всё это выглядит ужасно, но теперь мы можем делать в блейде следующее: появилась директива @use() и мы с помощью этой директивы указываем все необходимые импорты. Как и ранее, я всё ещё против логики в Blade-файлах, но в целом, иногда вот такие импорты необходимы. Даже вот в тех примерах, которые указаны в PR, когда нам нужно просто импортировать enum.
10.36.
Друзья, я думаю после релиза 10.35 вы ожидаете релиз 10.36. Но не тут-то было - он у нас куда-то пропал. И следующий будет 10.37.
10.37. Метод engine для Blueprint
https://github.com/laravel/framework/pull/49250
Немного сахара в объекты blueprint и scema. До этого чтобы указать Engine нам необходимо было пользоваться свойством, теперь нам доступен метод. И помимо Engine нам также доступны методы по изменению - charset и collation.
10.37. Получение индексов foreign ключей таблицы
https://github.com/laravel/framework/pull/49204
Передвигаемся к следующему PR. В данном случае у нас фасад schema и появились новые методы для нашего удобства - getIndexes() для получения всех индексов, и также если мы с вами заглянем в связанный PR, также появился метод по получению всех foreign keys - getForeignKeys().
10.37. Метод assertInvalid для проверки нескольких ошибок
И напоследок по 10.37 - тесты. Метод assertInvalid() для проверки сообщения об ошибках. До этого, если нам необходимо было проверить несколько ошибок в рамках одного поля, приходилось дублировать метод. Теперь же мы можем передавать массив и проверять весь набор ошибок от определённого поля.
Видео версия дайджеста
Эти же новости в формате видео от CutCode: