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

PHP Дайджест

Вышли PHP 8.2.16 и PHP 8.3.3

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

Вышел Composer 2.7

В Composer исправлена уязвимость CVE-2024-24821, которая позволяла выполнять код и допускала эскалацию привилегий.

Итоги ежегодного опроса PHP-сообщества

Опубликованы результаты за 2023 год.

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

Добро пожаловать в обсуждения PHP Foundation!

PHP Foundation запустил экспериментальные обсуждения как прямой ответ на запрос сообщества о более открытой и доступной платформе для общения.

Вы можете делиться мыслями и идеями без технической реализации, в отличие от технических списков рассылок PHP. Идеи также могут быть не связаны напрямую с исходным кодом.

Не стесняйтесь обращаться к руководству фонда или разработчикам.

? RFC: Add http_(get|clear)_last_response_headers() function

Переменная $http_response_header содержит все HTTP-заголовки, которые были получены при выполнении запроса через HTTP-обертку.

Поскольку создание переменной в локальной области видимости ужасно, $http_response_header предлагалось удалить еще в PHP 8.1, но из-за отсутствия альтернатив было решено оставить переменную.

Gina Peter Banyard предлагает добавить две новые функции: http_get_last_response_header(), которая будет выводить ту же информацию, что и переменная $http_response_header, и http_clear_last_response_header() для очистки последних заголовков.

?RFC: Multibyte for ucfirst, lcfirst functions, mb_ucfirst mb_lcfirst

RFC перешел на стадию голосования, но Tim Starling заметил, что предпочтительнее использовать регистр заголовка, а не верхний регистр.

Yuya Hamada добавил это уточнение в RFC, но из-за этого исправления RFC вернулся на стадию обсуждения, и голосование будет проведено заново.

? RFC: Add OOP methods to Curl objects

Сейчас объекты cURL по-прежнему являются непрозрачными типами для хранения и управления базовыми типами libcurl и не предлагают никаких API для использования авторами скриптов.

Sara Golemon предлагает добавить ООП-интерфейсы в модуль cURL и четыре новых исключения.

try {  
    (new \CurlHandle)->setOpt(YOUR_VOTE, true)->exec();
} catch (\CurlHandleException $ex) {
    assert(false);
}

RFC: Final by default anonymous classes

RFC: RFC1867 for non-POST HTTP verbs

Новая функция request_parse_body(), позволяющая обрабатывать данные формы для запросов PUT и PATCH, будет доступна начиная с версии PHP 8.4.

Laravel дайджест

Обновления Laravel

10.43. Add support for streamed JSON Response

https://github.com/laravel/framework/pull/49873#issue-2103868933

Этот PR затрагивает response. Появилась поддержка streamed json response, которая была добавлена в Symphony версии 6.3. Теперь также присутствует и в Laravel начиная с версии 10.43. Как видим в примере доступно с помощью метода Stream json и значения в виде генератора. 

<?php

namespace App\Http\Controllers;

use Generator;

use App\Models\User;

class ExampleController extends Controller

{
    public function index()
    {
        return response()->streamJson([
            'users' => $this->yieldUsers(),
        ]);
    }
    protected function yieldUsers(): Generator
    {
        foreach (User::query()->cursor() as $user) {
            yield $user;
        }
    }
}

Также стороной не обошло и тесты. Добавлен метод assertStreamedJsonContent

$response->assertStreamedJsonContent([
    'data' => [
        ['id' => 1],
        ['id' => 2],
        ['id' => 3],
    ],
]);

10.43. Add insertOrIgnoreUsing for Eloquent

https://github.com/laravel/framework/pull/49827

Следующий PR затрагивает Eloquent - добавился новый метод insertOrIgnoreUsing. У нас до этого был метод insertOrIgnore, для добавления записей, но если у нас возникала ошибка с дубликатом, запись игнорировалась. Мы не получали никаких исключений и просто добавляли только уникальные записи. Также у нас есть метод InsertUsing с подзапросом и появился также новый insertOrIgnoreUsing - смесь этих двух методов. Игнорируем дубликаты и используем подзапрос. 

10.43. Make hasIndex() Order-sensitive

https://github.com/laravel/framework/pull/49840

Благодаря этому PR у scema появился новый метод hasIndex с возможностью проверки существования индекса. Всё просто, дополнительный сахар. 

10.43. Add storage:unlink command

https://github.com/laravel/framework/pull/49795

Примечательный PR от нашего разработчика. Кстати насколько я помню он даже присутствует в нашем Telegram-чате, комьюнити CutCode, куда и Вас всех приглашаю. А PR добавляет новую консольную команду, которая у нас удаляет symlink storage. 

php artisan storage:unlink

Напомню что был storage:link, теперь присутствует и storage:unlink.

10.44. Add Collection::select() method

https://github.com/laravel/framework/pull/49845

PR затрагивает коллекции - появился метод Select,  который выбирает определенное количество ключей из многомерного массива. Раньше приходилось работать через Map, через Only и делать следующее. 

$users = $users->map(function ($user) {

  return collect($user)->only(['id', 'name', 'email']);

});

Теперь же у нас есть метод-обёртка Select, который будет делать то же самое и экономить нам время:

$users->select('id', 'name', 'email'])

10.44. Add toBase64() and fromBase64() methods to Stringable and Str classes

https://github.com/laravel/framework/pull/49984

Следующий PR добавляет в классы по работе со строками два метода toBase64() и fromBase64(). Чтобы быстро кодировать и декодировать соответственно в base64. 

return Str::toBase64('foobar');

10.44. Introduce new Arr::take() helper

https://github.com/laravel/framework/pull/50015

До этого PR у нас в коллекциях был метод take(), обертка над нативным array_slice(). Теперь мы также с вами получили take() и в саппорт-классе по массивам.

10.44. Introduce Observe attribute for models

https://github.com/laravel/framework/pull/49843

Следующие два PR, добавляют возможность работать с глобальными скопами и обсерверами через атрибуты. Кто ждал атрибуты в Laravel, вот они, потихоньку добираются и до него. В Laravel 11 насколько я видел, их будет ещё больше. 

Атрибут Observe, добавляем Обсервер-классы. Можем это сделать в виде массива и списком указать либо в несколько лайнов, совместимость при этом не нарушается. Через метод Boot их всё ещё можно будет добавлять: 

#[Observe(UserObserver::class)]
class User extends Authenticatable
{
    //
}

10.44. Add ScopedBy attribute for models

https://github.com/laravel/framework/pull/50034

Снова атрибуты и здесь уже по глобальным скопам. Просто указываем у Eloquent-модели, так же как и Observe:

#[ScopedBy(AncientScope::class)]
class User extends Model
{
    //
}

Можем указать несколько в виде массива и совместимость не нарушается. 

#[ScopedBy([FirstScope::class, SecondScope::class])]

Через Boot-метод также доступно.

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

Эти же новости в формате видео от CutCode:

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


  1. kozlov_de
    23.03.2024 06:18

    Вечно слышу про трудности обновления PHP

    Так что для текущих проектов это всё использовать сложно


  1. RichardBlanck
    23.03.2024 06:18
    +2

    Онанизм какой-то. Как будто в PHP нет реальных проблем.