Всем привет! Краткий обзор новостей из мира 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:
kozlov_de
Вечно слышу про трудности обновления PHP
Так что для текущих проектов это всё использовать сложно