Всем привет! Краткий обзор новостей из мира 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:
