Всем привет! Это PHP дайджест от CutCode. Давайте посмотрим, что произошло за прошедший месяц в мире PHP.

PHP Дайджест

Вышли PHP 8.2.17 и PHP 8.3.4

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

Вышли Doctrine ORM 3 и DBAL 4

Релизы являются кульминацией более чем десятилетней напряжённой работы десятков участников и сопровождающих Doctrine.

Вышел Rector 1.0

Первый стабильный выпуск инструмента для автоматического обновления и рефакторинга включает в себя новую конфигурацию Zen, новую команду custom-rule, автоматизированные наборы PHP и упрощённую интеграцию с новыми проектами.

Вышел PHPUnit 11

В этой версии атрибуты PHP 8 теперь используются вместо аннотаций PHPDoc и прекращено использование менее необходимых функций.

Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:

Релиз-менеджеры PHP 8.4

Начинается голосование за релиз-менеджеров 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: Property hooks

Хуки стали одним из самых больших и обсуждаемых 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();
})

Дайджест в формате видео:

Комментарии (0)