Всем привет! Краткий обзор новостей из мира PHP и Laravel за декабрь 2023 г от CutCode.

PHP Дайджест

Новости

Вышли PHP 8.1.27, PHP 8.2.14 и PHP 8.3.1

? Выпуски с исправлениями ошибок вышли по расписанию.

⛔️ Ветка PHP 8.1 прекратила активную поддержку и будет получать только обновления с исправлениями безопасности.

Вышел PhpStorm 2023.3

В этом большом обновлении представлена официальная версия AI Assistant, добавлена поддержка Pest и PHP 8.3, улучшена поддержка Symfony, улучшен интерфейс и многое другое.

Вышел Xdebug 3.3.0

В этом выпуске добавлена поддержка PHP 8.3, Flame-графиков и управляющих сокетов.

Вышел FrankenPHP v1.0

Современный сервер 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: