PHP и Laravel дайджест новостей за июнь 2024 года

Всем привет!

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

Новости PHP

В этих выпусках исправлены уязвимости:

  • Инъекция аргументов в PHP-CGI.
  • Обход фильтра FILTER_VALIDATE_URL в функции filter_var.
  • Экранирование аргументов для bat- и cmd файлов в Windows окружении для функции proc_open.
  • Уязвимость к атаке Marvin функции openssl_private_decrypt.

Пожалуйста, обновитесь, как можно скорее.

PHP исполнилось 29 лет!

8 июня 1995 года Rasmus Lerdorf впервые объявил о PHP.Рома Пронский опубликовал ролик, в котором он скомпилировал и запустил первую версию языка. Посмотрите, каким был PHP 29 лет назад.

С днем рождения, PHP! 🎉🥳🎂

Прошел митап Beer PHP Moscow, на котором выступили с докладами про профилирование и асинхронные PHP-приложения Алексей Сидоркин (Архитектор ГК Т1), Максим Хасанов (Team lead, АльфаСтрахование) и Валентин Удальцов (автор каналов Пых и PHP Point, преподаватель Хардкорного курса PHP).

Lamoda Tech MeetupПрошел еще один митап от команды Lamoda Tech на котором выступили Михаил Мохначёв и Константин Козин, рассказав как почти безболезненно перейти на язык Go PHP-разработчику.

Developer Ecosystem Survey 2024Команда JetBrains запустила восьмое ежегодное исследование экосистем разработчиков, посвященное текущему состоянию индустрии разработки программного обеспечения.Прохождение опроса не займет много времени, а JetBrains, как всегда, поделится результатами исследования.

Projects IDX

Google анонсировала свой новый инструмент онлайн-среды разработки, который поставляется с шаблоном Laravel из коробки. В своем личном телеграм канале Данил уже поделился первыми впечатлениями, почитайте, если еще видели.

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

✅ RFC: Add stream open functions to XML{Reader,Writer}

Niels Dossche предлагает добавить два новых метода для работы с потоком модуля XML:

XMLReader::fromStream() XMLWriter::toStream()

📣 RFC: Static Constructors

Erick de Azevedo Lima предлагает добавить новый магический метод __staticConstruct, который будет вызываться автоматически при вызове статического метода.

📣 RFC: Static class

Paul Morris предлагает добавить новый тип класса – статический. Статический класс определяется ключевым словом static, а все методы этого класса автоматически становятся статическими. В настоящее время в PHP можно объявить статическими отдельные методы.

Arnaud Le Blanc и Nicolas Grekas предлагают добавить ленивые объекты в PHP.

Ленивые объекты не будут инициализироваться до тех пор, пока в этом нет необходимости, например, не будет прочитано или изменено свойство объекта.

Ленивые объекты большинство пользователей не будут использовать напрямую, в первую очередь они предназначены для авторов библиотек и фреймворков.

Группа авторов Niels Dossche, Gina Peter Banyard, Máté Kocsis, Tim Düsterhus, Kamil Tekiela и Jorg Sowa запустила обсуждение RFC, чтобы определить какой функционал объявить устаревшим в PHP 8.4 и удалить в PHP 9.0.

Laravel дайджест

Обновления Laravel

11.10. Allow callback to be passed to updateOrInsert() to pass different $values if the record already exists

PR затрагивает QueryBuilder, прокачали метод updateOrInsert(). Описание PR начинается с проблемы.

Я думаю, вы знаете, что updateOrInsert() под капотом в себе содержит два запроса. Сперва мы ищем, есть ли такая запись. Соответственно, если есть, то делаем Update, в противном случае Insert. Но если, как в примере у автора:

$values = [ 'name' => $data['name'], 'email' => $data['email'], ]; $exists = DB::table('users')->where('user_id', $user_id)->exists(); if (! $exists) { $values['optional_column'] = $data['foobar']; } DB::table('users')->updateOrInsert( ['user_id' => $user_id], $values );

нам необходимо сделать Update полей с дополнительным условием, например, если запись существует, то набор полей будет иным. В таком случае нам придется сперва дополнительно проверить, есть ли запись. Далее на проверке уже сформировать массив и уже после вызвать этот сахар.

Казалось бы, зачем вообще всем этим заниматься? Сделай отдельные два запроса без сахара Laravel, но это не путь Laravel, поэтому прокачали метод updateOrInsert(). Вторым параметром можно теперь передать callback, который в себе будет иметь boolean-значение, есть ли уже запись в таблице, и если есть, мы можем строить дополнительные условия и формировать массив на updateOrInsert():

DB::table('users')->updateOrInsert( ['user_id' => $user_id], function ($exists) use ($data) { if ($exists) { return [ 'name' => $data['name'], 'email' => $data['email'], ]; } return [ 'name' => $data['name'], 'email' => $data['email'], 'optional_column' => $data['foobar'], ]; } );

11.11. Give session ID retrieval the Laravel treatment

Первый PR у нас затрагивает сессии, теперь нам не придется писать такой длинный метод getId и появился просто Id:

use Illuminate\Support\Facades\Session; - Session::getId(); + Session::id();

В изменениях PR видим, что Id это обертка над методом getId.

11.11. Add get, write and forget cache events

В следующем PR, появились события по кэшу. В изменениях по PR, видим, что добавлен набор событий:

И соответственно в репозитории, когда сбрасываем кэш или добавляем в кэш, будут дергаться определенные события и теперь появились дополнительные возможности для отслеживания и взаимодействия.

11.11. Add before and after methods to Collection

PR затрагивает коллекции. Добавлены два новых метода before и after. У нас есть коллекция, как в примере:

$collection = collect([1, 2, 3, 4, 5, 'name' => 'taylor', 'framework' => 'laravel']); $collection->before(2) // 1 $collection->before('taylor') // 5 $collection->before('laravel') // 'taylor' $collection->before(fn ($value) => $value > 4) // 4 $collection->before(fn ($value) => ! is_numeric($value)) // 5 $collection->before(1) // null $collection->before('not found') // null

Благодаря методу before мы можем указать значение одного из элементов коллекции и получить предыдущее.

Например, через метод before указываем двойку - получаем предыдущее значение - единицу, указываем значение taylor, получаем пятерку. Также поддерживается и callback. After выполняет то же самое действие, только после указанного элемента.

11.11. About command improvement

Простой PR, который продолжает улучшать artisan-команду about - добавили переменные timezone и locale из текущего конфига.

11.11. Add Relation::getMorphAlias()

Следующий PR добавляет новый метод у класса Relation, чтобы получить alias у Morph-типа модели. Как видим просто указываем модель и получаем alias если он у нас ранее зарегистрирован.

$this->assertDatabaseHas('taskables', [ 'taskable_type' => Relation::getMorphAlias(Document::class), 'taskable_id' => $mitigation->id, 'task_id' => $taskB->id ]);

11.11. Support third-party relations in model:show command

PR прокачивает artisan-команду model:show (находит отношения модели). Теперь эта команда будет демонстрировать нам также third-party relations, например из пакетов.

11.11. Chop PHP extension when passed to make commands

Раньше при вызове команд которые генерируют определенные классы, если указать расширение .php, то у вас будет сформирован класс с двойным расширением. Благодаря этому pull request, если вдруг и прописали расширение, то оно у нас будет тримиться.

До:

php artisan make:controller UserController.php # Controller [app/Http/Controllers/UserController.php.php] created successfully.

После:

php artisan make:controller UserController.php # Controller [app/Http/Controllers/UserController.php] created successfully.

11.12. Add multiply to collection

PR по коллекциям, на этот раз добавили метод multiply. Что он из себя представляет? Например, у нас есть коллекция с определенным набором:

<div> {{ $user->name }} {{ $user->name }} {{ $user->name }} {{ $user->name }} </div>

Multiply их будет дублировать и повторно пушить указанное количество раз:

@foreach($class->students->multiply(4) as $student) <x-student :student="$student" /> @endforeach

11.12. Add multiply to collection

PR добавляет в EventServiceProvider статический метод, который позволяет указывать где именно нам автоматически искать наши ивенты. И таких директорий может быть несколько. Можем указать либо строкой, либо в виде массива.

11.13. Account for long strings on new Laravel error page

PR прокачивает верстку новой error page. Поправлены моменты, когда длинные строки с содержанием ошибки ломали верстку или выходили за экран на дисплеях с небольшим разрешение. Проблемы решены и error page выглядит еще лучше.

11.13. Add Support for Extensions in Str::markdown Method

Следующий PR затрагивает Helper по работе со строками. Метод Markdown. Третим параметром также принимает набор extension из набора CommonMark:

public function parseMarkdownFromFile($file_location){ $markdown_contents = File::get($file_location); $html = Str::markdown($markdown_contents, [], [ new AttributesExtension(), new TaskListExtension(), ]); return $html; }

Автор PR даже снял минутный ролик о том как это работает. Как это выглядело до и как он прокачал рендер Markdown.

11.13. Update config:show command

PR который прокачивает команду config:show. До этого были проблемы с отображением конфига через "dot"-нотацию. Ошибка если конфиг не найден была некорректной - теперь исправили.

11.13. Display view creation messages

Следующий PR улучшил отображение информации. Раньше при создании компонента у нас отображалось, что компонент по указанному пути успешно создан, но при этом не говорилось о том, что также создана вьюха. Теперь эта проблема решена.

11.13. Introduce Str::chopStart and Str::chopEnd

Прокачали Helper-класс по работе со строками, добавили несколько новых методов ChopEnd, ChopStart, ReplaceEnd и ReplaceStart. ChopEnd нам дает возможность получить значение строки до указанного выражения и аналогично ChopStar (только указываем после какого значения). Также можно передавать массив с несколькими значениями:

Str::chopEnd('path/to/file.php', '.php'); // "path/to/file" Str::chopStart('https://laravel.com', ['https://', 'http://']); // laravel.com

Метод replaceEnd заменяет окончание строки на указанное значение, если эта строка заканчивается на определённую подстроку. Аналогично работает ReplaceStart.

Видео-версия дайджеста:

Данил Щуцкий. CutCode

2727
7 комментариев

Интересная статья, как раз хотела узнать информацию о том какие уязвимости были исправлены в новых выпусках PHP

Ответить

Про Laravel как-то кусками, много мелких улучшений, но ничего революционного. Хотя новый метод updateOrInsert() с коллбэком - удобно, раньше приходилось извращаться.

Ответить

Много нового, интересного. Отлично что всё подано в сжатой форме, хороший обзор спасибо!!!

Ответить

Теперь я в курсе актуальных обновлений. Продолжайте такой формат. Что касается некоторых новостей, то есть легкое недоумение.

Ответить

Спасибо за грамотную статью, теперь мои звания в PHP стали куда больше!

Ответить

Невероятно видеть, как PHP развивался на протяжении этих лет! С днем рождения, PHP!

Ответить

Отличный дайджест! Как PHP-разработчик, особенно заинтересовался новыми методами в коллекциях Laravel - multiply и before/after. Часто сталкиваюсь с задачами, где они пригодятся. Также порадовало улучшение команды model:show для отображения отношений из сторонних пакетов. Это сэкономит время при работе с большими проектами. А вот static класс в PHP - интересная идея, но нужно подумать, как это впишется в текущую архитектуру языка.

Ответить