PHP и Laravel дайджест новостей за февраль 2024 года
Всем привет! Краткий обзор новостей из мира PHP иLaravel за февраль 2024 года от CutCode.
PHP Дайджест
Вышли PHP 8.2.16 и PHP 8.3.3
🐛 Выпуски с исправлениями ошибок вышли по расписанию.
В 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: