Всем привет! Краткий обзор новостей из мира PHP иLaravel за январь 2024 года от CutCode.
PHP Дайджест
Вышли PHP 8.2.15 и PHP 8.3.2
🐛 Выпуски с исправлениями ошибок вышли по расписанию.
The PHP Foundation Team Update 2024
В этом году к PHP Foundation присоединятся еще четыре разработчика для дальнейшего развития PHP: David Carlier, James Titcumb, Saki Takamachi и Shivam Mathur.
Рейтинг TIOBE
В рейтинге TIOBE PHP за год поднялся на 3 строчки и занял 7 место, уступив Python, C, C++, Java, C# и JavaScript.
Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:
📣RFC: Opt-in DOM spec-compliance
Модуль DOM изначально соответствовал спецификацииDOM Core Level 3, но не может поддерживать «Живую спецификацию» из-за множества ошибок.
Niels Dossche предлагает за счетHTML 5 RFC, который уже одобрен для PHP 8.4, добавить новую реализацию DOM, поддерживающую «Живую спецификацию», сохранив старую для обратной совместимости.
📣Dedicated StreamBucket class
Сейчас нет отдельного класса для работы с бакетами потока и используется stdClass.
Máté Kocsis предлагает добавить новый окончательный класс StreamBucket для облегчения статического анализа и улучшения обратной связи.
📣RFC: Multibyte for ucfirst, lcfirst functions, mb_ucfirst mb_lcfirst
Yuya Hamada предлагает добавить многобайтовую поддержку для функций ucfirst и lcfirst; по аналогии, в PHP 8.4 уже будет доступна многобайтовая поддержка для функций trim, ltrim и rtrim.
📣RFC: Raising zero to the power of negative number
Сейчас возведение в отрицательную степень нуля возвращает float(INF).
Jorg Sowa предлагает PHP 8.4 выдавать предупреждение об устаревании, а начиная с PHP 9.0 – выбрасывать исключение.
📣RFC: Deprecate implicitly nullable parameter types
Сейчас использование null в качестве значения по умолчанию для параметра функции, явно не допускающего null, разрешено и не приводит к ошибке.
Máté Kocsis и Gina Peter Banyard предложили объявить такое поведение устаревшим и предлагать пользователю явно указать использование null.
✅RFC: Improve callbacks in ext/dom and ext/xsl
Методы XSLTProcessor::registerPHPFunctions() и DOMXPath::registerPhpFunctions() смогут использовать тип callable в PHP 8.4.
✅RFC: Resource to object conversion
RFC был принят единогласно.
Вторичное голосование определило, что ресурсы основного потока, вспомогательные ресурсы потока и ресурс процесса будут преобразованы в PHP 9.0, а остальные ресурсы будут преобразованы в PHP 8.4 или другой минорной версии.
📊RFC: Promote the PHP Foundation
Это нетехнический RFC, возникший из PR дляphp/web-php для продвижения PHP Foundation на сайте php.net.
📊RFC: Final by default anonymous classes
Daniil Gentili предлагает сделать все анонимные классы окончательными по умолчанию и предоставить новое ключевое слово open, чтобы при необходимости сделать их неокончательными. Это похоже на new open class {} в Kotlin.
📊RFC: Policy Repository
RFC был принят единогласно, политики будут храниться в репозиторииphp/policies.
📊RFC: RFC1867 for non-POST HTTP verbs
Ilija Tovilo предлагает добавить новую функцию request_parse_body(), чтобы вывести существующую функциональность на пользовательский уровень и использовать ее для других HTTP-методов, например, PUT и PATCH.
🎉Новый PECL появится в 2024 году
PHP Foundation собирается пересмотреть способ установки модулей в PHP.
Сейчас модули распространяются с помощью устаревшего сайта pecl.php.net и инструмента pecl. Цель состоит в том, чтобы предоставить современную альтернативу, которая будет проще в использовании как для пользователей, так и для разработчиков модулей.
Laravel дайджест
Обновления Laravel
10.39. Dynamic Max Tries on Queued Jobs
https://github.com/laravel/framework/pull/49473
Первый PR обновления 10.39 затрагивает джобы и добавляет новый метод Tries для динамического объявления количества попыток. Раньше было только свойство, теперь есть метод и появилась возможность более универсально определить поведение.
10.39. Add 'Roundrobin' Symfony mailer transport driver
https://github.com/laravel/framework/pull/49435
В раздел по отправке email уведомлений добавили драйвер Roundrobin. Информацию по порядку работы добавлена в документацию Laravel.
10.40. Add session except method
https://github.com/laravel/framework/pull/49520
В рамках сессий появился новый метод except. С его помощью можно получить все элементы сессии за исключением тех, которые мы укажем.
10.40. Add Number::clamp
https://github.com/laravel/framework/pull/49512
Этот PR затрагивает класс Number. Как я вам говорил ранее, когда подробно освещал этот класс в ролике на YouTube, последующие релизы laravel будут добавлять всё больше сахара в этот класс. Так и происходит. Появился новый метод clamp. “Зажимаем” число в диапазоне от минимума до максимума:
public static function clamp (number, min, max);
public static function clamp (53, 0, 1000) // =>53
public static function clamp (10, 20, 30) // =>20
10.40. Make the Schema Builder macroable
https://github.com/laravel/framework/pull/49547
В Schema Builder появился Trait macroable. Всё чаще он появляется в различных сущностях и теперь Schema Builder не исключение. Можем где-нибудь в провайдере добавлять свои методы через macro и позже пользоваться им в миграциях.
10.40. Add assertViewEmpty to TestView
https://github.com/laravel/framework/pull/49558
Следующий Pull Request добавляет метод в процесс тестирования assertViewEmpty, чтобы проверить что у нас View в Responce срендерило пустой результат.
10.40. Update tailwind.blade.php for dark mode
https://github.com/laravel/framework/pull/49515
PR, который добавляет тёмный режим в тему для пагинатора на основе TailwindCSS.
10.40. Allow Vite asset path customization
https://github.com/laravel/framework/pull/49437
Интересный PR. Раньше, чтобы получить итоговый путь до ассетов у нас был хелпер Asset. Но если у нас в системе зарегистрированы Tenants, то необходимо получить динамический итоговый url до ассета, и с этим возникали сложности. Теперь же в рамках фасада Vite появился метод createAssetPathUsing и мы можем динамически задавать url на основе той логики, которая нам необходима.
10.40. Add assertCount test helper
https://github.com/laravel/framework/pull/49609
PR по тестам - assertCount. Используется чтобы проверить какое количество заданий (Jobs) добавлено в очередь.
10.40. Add APA style title helper
https://github.com/laravel/framework/pull/49572
PR затрагивает класс по работе со строками и добавляет новый метод APA, который позволяет переформатировать строку c заголовком на основе APА стиля. Есть сайт https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case,
на котором подробно рассказано что это за стиль такой, как он выглядит, где используется. Если вкратце - важные слова приводятся в upper case, остальные остаются в нижнем регистре.
10.41. Add a threshold parameter to the Number::spell helper
https://github.com/laravel/framework/pull/49610
Опять класс Number и метод spell немного модифицирован. Теперь появилась возможность задать порог threshold parameter, чтобы приводить число к тому, как мы его произносим только тогда когда оно в этом диапазоне.
Напомню, метод spell приводит числа к строке, к тому как мы это число произносим. Например 8 будет eight.
Теперь появились два новых параметра, а именно After и Until. Рассмотрим примеры:
$this->assertSame('9', Number::spell(9, after: 10));
$this->assertSame('eleven', Number::spell(11, after: 10));
Глядя на тесты, мы видим, что если мы передаем “9”, но при этом указываем в параметре”after: 10”, то не получим “nine” строку, а “9”. А если укажем 11, с параметром ”after: 10”, то уже результат будет строка - “eleven”. То же самое с параметром Until, только наоборот.
10.41. Allow job chains to be conditionally dispatched
https://github.com/laravel/framework/pull/49624
Новые методы dispatchIf и dispatchUnless для цепочек заданий (job chains). С их помощью можно указать условие, только при выполнении которого мы будем диспатчить указанный набор заданий (job).
10.42. Add Str::unwrap
https://github.com/laravel/framework/pull/49779
PR работе со строками. Был метод wrap чтобы обернуть строку указанными символами, теперь также появился и unwrap, чтобы соответственно сделать обратное. Рассмотрим пример. Есть строка с кавычками, используем unwrap и указываем что необходимо убрать обёртку в виде кавычек. И в итоге получаем строку без кавычек. То же самое с фигурными скобками:
Str::unwrap('"Unquote"', '"'); // Unquote
Str::unwrap('{ some: "json" }', '{', '}'); // some: "json"
10.42. Global default options for the http factory
https://github.com/laravel/framework/pull/49767
В PR появился метод с помощью которого можно указать глобально опции. В дальнейшем при использовании нашего приложения, опции у http клиента будут заданы по умолчанию.
10.42. Implement "max" validation rule for passwords
https://github.com/laravel/framework/pull/49739
Правило валидации по паролям. До этого была возможность задать минимальное количество символов в пароле, но не было удобного метода по максимальному количеству. Приходилось добавлять через метод Rules дополнительные правила валидации и писать следующее:
Password::min(8)->rules('max:32');
Теперь же этого делать не придётся, нам добавили сахар с методом по максимальному количеству символов:
Password::min(8)->max(32);
10.42. Add multiple channels/routes to AnonymousNotifiable at once
https://github.com/laravel/framework/pull/49745
Теперь добавлена возможность указывать сразу несколько routes и отправлять уведомления по всем ним сразу.
Как видим в примере, мы отправляем уведомления и на email и по номеру телефона:
NotificationFacade::routes([
'mail' => ['example@test.local' => 'Test Customer'],
'vonage' => '+3620123456',
])->not
Видео версия дайджеста
Эти же новости в формате видео отCutCode: