Всем привет! Это PHP дайджест от CutCode. Давайте посмотрим, что произошло за прошедший месяц в мире PHP.
PHP Дайджест
Вышли PHP 8.2.17 и PHP 8.3.4
? Выпуски с исправлениями ошибок вышли по расписанию.
Релизы являются кульминацией более чем десятилетней напряжённой работы десятков участников и сопровождающих Doctrine.
Первый стабильный выпуск инструмента для автоматического обновления и рефакторинга включает в себя новую конфигурацию Zen, новую команду custom-rule, автоматизированные наборы PHP и упрощённую интеграцию с новыми проектами.
В этой версии атрибуты PHP 8 теперь используются вместо аннотаций PHPDoc и прекращено использование менее необходимых функций.
Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:
Начинается голосование за релиз-менеджеров PHP 8.4.
В этом году кандидаты Yuya Hamada – автор нескольких RFC, Calvin Buckley – разработчик нескольких модулей PECL, Saki Takamachi – core-разработчик, поддерживаемая PHP Foundation и Matteo Beccati – разработчик, который также вносит вклад в ядро PHP.
Голосование пройдёт с 1 по 15 апреля.
PHP Foundation: Отчёт о прозрачности за 2023 год
Сейчас фонд спонсирует 10 инженеров для работы над ядром и инфраструктурой PHP, получает спонсорскую помощь от крупных PHP-компаний и получил инвестиции от фонда, поддерживаемого правительством Германии.
На 2024 год группа фонда запланировала несколько значительных проектов, включая новый инструмент для установки модулей PHP, аудит безопасности и обновление документации.
Роман Пронский – операционный менеджер фонда, спонсируемый JetBrains. Посмотрите его доклад на Laracon EU, чтобы узнать больше о фонде:
LARACON EU 2024 // ROMAN PRONSKIY :: THE PHP FOUNDATION
✅RFC: Multibyte for ucfirst, lcfirst functions, mb_ucfirst mb_lcfirst
RFC принят единогласно, новые функции появятся в PHP 8.4.
?RFC: Rounding Integers as int
На данный момент функции округления round(), ceil() и floor() возвращают число с плавающей точкой, но при использовании целых чисел выше 2^53 получаются неожиданные результаты из-за потери точности.
Marc Bennewitz предлагает выполнять округление для заданного целого числа и возвращать полученное целое число, если это возможно.
Голосование продлится до 2 апреля, но судя по распределению голосов на текущий момент, RFC будет отклонен.
? RFC: Grapheme cluster for str_split function: grapheme_str_split
Yuya Hamada предлагает добавить новую функцию grapheme_str_split, которая позволит корректно работать с эмодзи и вариантными селекторами.
Хуки стали одним из самых больших и обсуждаемых RFC в PHP за последние несколько лет. После обсуждения авторы предложения, Larry Garfield и Ilija Tovillo, существенно обновили детали.
? RFC: Support object type in BCMath
BCMath в настоящее время поддерживает только процедурные функции. Saki Takamachi предлагает добавить в модуле поддержку объектов типов.
? RFC: Deprecate GET/POST sessions
PHP поддерживает два способа распространения идентификатора токена сессии: с помощью файлов cookie и с помощью параметров GET или POST.
Kamil Tekiela предлагает выдавать предупреждение об устаревании в PHP 8.4, если параметр session.use_only_cookies отключен, а параметр session.use_trans_sid – включен.
В PHP 9.0 предлагается полностью отказаться от распространения идентификатора токена сессии с помощью параметров GET или POST.
На канале CutCode прошла первая викторина «Своя игра» по PHP
Адель Файзрахманов, Александр Макаров и Кирилл Несмеянов ответили на каверзные вопросы по PHP. Обязательно посмотрите, если пропустили. А также пишите свои пожелания, замечания и вопросы для следующих игр - ссылка на форму.
Релиз сервиса по деплою приложений onFriday.
Состоялся релиз сервиса для деплоя PHP-приложений в один клик с нулевым временем простоя и контролем результата - onFriday. Всё что есть в Envoyer + дополнительные функции.
Laravel дайджест
Обновления Laravel
10.46. Add only and except methods to Enum validation rule
https://github.com/laravel/framework/pull/50226
PR по правилам валидации. Касается метода enum
. Теперь можно не просто указать enum на основе которого мы будем валидировать значение в реквесте, а также воспользоваться методами Only
и Except
чтобы только указать какие enum
кейсы будут участвовать в валидации. Либо определённые исключить.
10.46. Custom RateLimiter increase
https://github.com/laravel/framework/pull/50197
PR затрагивает RateLimit
. В описании PR нас встречает собственно проблема - что часто бывает так, что определённые запросы должны увеличивать счетчик RateLimit
не на одно значение, а сразу на несколько. Например, определённая логика и вот определенный запрос должен увеличивать RateLimit
сразу на несколько единиц. И сейчас с тем интерфейсом который у нас есть с RateLimit
этого достичь можно только в том случае если добавить цикл и несколько раз дёрнуть инкремент. Не хватает сахара. PR добавляет этот сахар - у нас появился новый аргумент в методе инкремент где мы можем передать количество на которое нам нужно RateLimit
увеличить. И в итоге без всяких циклов просто с передачей параметра мы с вами решим ту задачу, о которой нам сообщает автор этого PR.
10.46. Add Conditionable in enum rule
https://github.com/laravel/framework/pull/50257
Всё ещё правила валидации и enum
. И видим что trait
с методом when
продолжает путешествие по классам в Laravel и теперь он затрагивает и валидацию, а именно взаимодействие с enum
.
10.47. Add fail on timeout to queue listener
https://github.com/laravel/framework/pull/50352
PR затрагивает listener очередей. Появилось новое свойство $failOnTimeout
и теперь вот здесь мы его с вами наблюдаем:
/**
* Indicates if the job should fail if the timeout is exceeded.
*
* @var bool
*/
public $failOnTimeout = false;
И также она у нас передаётся в job на основе этого свойства из listener. Мы будем указывать логику fail
при timeout
, либо нет:
$job->failOnTimeout = $listener->failOnTimeout ?? false;
10.47. Support sort option flags on sortByMany Collections
https://github.com/laravel/framework/pull/50269
PR затрагивает коллекции и метод sortBy
. До этого возникала проблема: при использовании sortBy
мы вторым параметром можем передать флаг, каким именно образом выстраивать сортировку. Но если мы указываем несколько ключей, то флаг игнорируется. Решение было через функции указывать на каждое поле свою логику. Теперь же после этого PR можно указывать несколько ключей и флаг сортировки не будет игнорироваться.
10.47. Add whereAll and whereAny methods to the query builder
https://github.com/laravel/framework/pull/50344
PR затрагивает query Builder и добавляет нам сахара. В примере нужно выполнить поиск - like First name
или Last name
, либо в email, либо в телефоне. До этого нам приходилось реализовывать вот такие группы с orWhere
в рамках одного и того же значения. Вот такая портянка у нас получалась:
$search = '%Otwell%';
User::query()
->where(function ($query) use ($search) {
$query
->where('first_name', 'LIKE', $search)
->orWhere('last_name', 'LIKE', $search)
->orWhere('email', 'LIKE', $search)
->orWhere('phone', 'LIKE', $search);
})
Теперь же у нас такая же портянка, но немного иначе выглядит:
$search = '%Otwell%';
User::query()
->whereMultiple([
'first_name',
'last_name',
'email',
'phone'
], 'LIKE', $search)
...
Через сахар, через новый метод. Правда в процессе PR его переименовали и он стал whereAny
. И следующий метод - это как раз whereAll
. Суть его такая же только у нас условия где не "или" а "и". И мы с Вами просто пишем whereAll
и получается вот такой результат:
$search = 'test';
User::whereAll([
'first_name',
'last_name',
'email',
], 'LIKE', "%$search%")
...
Я думаю интересный PR в рамках query Builder и обязательно им буду пользоваться.
10.47. Adds Reverb broadcasting driver
https://github.com/laravel/framework/pull/50088
Напоследок по 10.47. Мы уже об этом с вами давно знаем, но это произошло именно в релизе Laravel 10.47, а не в Laravel 11. Taylor не стал дождаться и добавил reverb broadcasting driver
прямо в коробку с Laravel.
Релиз 10.48 по большему счёту состоит из фиксов перед релизом мажорной версии Laravel 11.
После релиза Laravel 11 оперативно выпускались исправления 11.0.1 - 11.0.8.
11.1. Accept non-backed enum in database queries
https://github.com/laravel/framework/pull/50674
PR затрагивает касты и теперь если вы делаете cast
к enum
, то также поддерживаются и non-backed enum
. До этого возникала ошибка. Кстати PR в одиннадцатую версию, а мы наблюдаем всё ещё старый подход через свойства.
11.1. Add Conditionable trait to Context
https://github.com/laravel/framework/pull/50707
Этот PR - всеми любимый Context. Я уже записывал ролик про Context (обязательно посмотрите моё мнение) и Trait Conditionable
.
11.1. Adds withSchedule to bootstrap/app.php file
https://github.com/laravel/framework/pull/50755
И напоследок по релизу 11.1 - bootstrap/app.php
. Там где у нас теперь вся вот эта портянка по конфигурации нашего приложения, также появился метод по формированию расписания:
->withSchedule(function ($schedule) {
$schedule->command('backup:database')->daily();
})
Дайджест в формате видео: