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

от автора

Всем привет!

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

Новости PHP

Первые альфа-версии PHP 8.4 доступны для тестирования

Вышли первые две альфа-версии, дающие начало выпуска PHP 8.4. Обновления будут выходить каждые две недели по определенному графику, а финальный выпуск ожидается 21 ноября.

Заморозка функций ожидается 13 августа, а это значит, что некоторые изменения еще могут попасть в выпуск. На данный момент наиболее заметными являются следующие изменения:

Напоминаю, что, с этого года сократился предрелизный цикл, вместо 6 релиз-кандидат версий, теперь будет 4, а каждая версия теперь поддерживается на год дольше.

Поздравляю Кельвина, Саки и Эрика!

Вышли PHP 8.2.21 и PHP 8.3.9

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

Ядро PHP

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

?RFC: Static class

RFC, о котором мы говорили в прошлом выпуске, отклонен после голосования.

?RFC: Lazy Objects

Еще один RFC из прошлого выпуска, после проведения голосования был принят

?RFC: Allow int type argument to BCMath function

В настоящее время функции BCMath принимают значения только в виде строк. Saki Takamachi предлагает разрешить передавать целочисленные значения.

?RFC: Add bcdivmod to BCMath

На данный момент в PHP существует функция bcdiv для деления чисел произвольной точности, а также функция bcmod для получения остатка после деления. Saki Takamachi предлагает добавить новую функцию bcdivmod, чтобы получать частное и остаток за одну операцию в виде массива.

?RFC: Property hook improvements

После внедрения хуков свойств, Ilija Tovilo и Larry Garfield нашли способ реорганизовать логику, чтобы увеличить производительность.

?RFC: Asymmetric Visibility v2

Ilija Tovilo и Larry Garfield представили вторую версию своего RFC, который был отклонен в прошлом году. Ребята предлагают добавить синтаксис, подобный Swift, чтобы разрешить свойствам иметь отдельную («асимметричную») видимость для операций чтения и записи.

Laravel дайджест

Обновления Laravel

11.14. Adding Pest stubs to publish command

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

PR затрагивает стабы. Уже давно PEST по-дефолту в Laravel, но при этом при публикации, стабов по PEST не было. Теперь будут. 

11.14. Adds support for Markdown extensions to the Stringable class

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

PR затрагивает Stringable-метод Markdown. Мы уже знаем, что этот метод также стал поддерживать extensions. Теперь передавать расширение в метод Markdown мы сможем через helper Stringable

$html = str('# My Heading')->markdown(extensions: [new HeadingPermalinksExtension()]);

11.14. Improvements for the ServeCommand (add more loves & elevate DX) 

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

PR затрагивает команду по запуску виртуального сервера и немного ее прокачивает. Output до этого показывал время ответа в секундах и не все эндпоинты реквестов. После этого PR мы видим все эндпоинты каждого реквеста и также видим время ответа в миллисекундах:

11.14. Add support for acting on attributes through container

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

Крутой PR, его еще не добавили в документацию, по крайней мере я не заметил. Итак, сервис контейнер теперь также будет поддерживать атрибуты. Появился метод whenHas (на самом деле чуть позже в процессе ревью PR он переименован whenHas attributes, но сути не меняет). Давайте взглянем например:

#[Attribute(Attribute::TARGET_PARAMETER)]  class AuthGuard implements ContextualAttribute  {  public function __construct(  public readonly string $name  ) {}  }

Далее, на уровне контейнера и нового метода мы делаем проверку. Если при Resolve сервиса через контейнер у определенного свойства будет этот атрибут, то в функции мы решаем, что именно в данном случае мы с вами вернем. 

final class MyService  { public function __construct(         #[AuthGuard('api')]         private readonly Guard $guard     ) {} }  $service = Container::getInstance()->make(MyService::class);

Вот, например, у нас есть сервис, мы его получаем через контейнер, мы вешаем атрибут AuthGuard и указываем, что name у нас API. И в таком случае при резолве этого сервиса у нас в свойстве guard будет не просто guard, а у нас сразу будет с указанным name API. 

Но не спешите обновлять Laravel и играться с новым функционалом, давайте взглянем дальше, также добавлен метод afterResolvingAttribute:

Container::getInstance()->afterResolvingAttribute(      attribute: OnTenant::class,     callback: function (OnTenant $attribute, Connector $connector) {         $connector->onTenant($attribute->tenant);     }  );

Мы получаем зависимость, которую резолвим через DI, если на ней висит указанный атрибут. И в данном примере мы видим коннектор с атрибутом OnTenant и после резолва мы в этот коннектор дополнительно прокидываем определенную логику.

11.15. feat: add generics to Eloquent Builder and Relations

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

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

11.15. Add support for mime types in Resend mail transport

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

PR у нас затрагивает класс mailable:

public function attachments(): array  {     return [         Attachment::fromPath('/path/to/file')                 ->as('name.pdf')                 ->withMime('application/pdf'),     ]; }

добавлен метод withMime и для attachment мы сразу можем указать MimeType через Builder. 

11.15. Feat: improve Factory generics, add generics to HasFactory

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

Не уходим далеко от темы дженериков, также улучшения дошли до фабрик.

И мы также к трейту можем указать, какую именно фабрику будет возвращать модель:

// before  class User extends Authenticatable  {     use HasFactory;     protected function newFactory(): UserFactory     {         return UserFactory::new();     } }  // after  class User extends Authenticatable  {     /** @use HasFactory<UserFactory> */     use HasFactory;     protected static string $factory = UserFactory::class; }

Очень полезно, так скоро дойдем и до того, что будем справляться и без плагина Laravel IDEA.

11.15. Ask About View Next To Name For Create Mail Command

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

PR затрагивает команду по генерации класса и если требуется вьюхи, для отправки email-уведомлений. До этого нам нужно было указывать через аргументы, какая именно вью нужна.

Теперь нас ждет интерактивная форма, где мы укажем класс, укажем нужна ли нам вьюха либо не нужна, и все что нам требуется выберем прямо не отходя от консоли, без необходимости вспоминать какие там аргументы присутствуют:

11.15. Make Router Tappable

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

Большой PR, который у нас затрагивает роутер. Добавился трейт Tappable. Тем самым в роутере у нас будет доступен метод метод tap. Если у вас большая инфраструктура: пакетная, с доменами, теперь не придется как ранее подключать кучу файлов, так же дополнительно в тестах подключать эти файлы и все будет выглядеть следующим образом:

class RouteRegistrar  {     private const string ENDPOINT = 'redacted';     public function __invoke(Router $router)     {         $router->post(self::ENDPOINT, WebhookController::class)->name(self::ENDPOINT);     } }  $router     ->tap(new Redacted1Webhooks\RouteRegistrar())     ->tap(new Redacted2Webhooks\RouteRegistrar())     ->tap(new Redacted3Webhooks\RouteRegistrar())     ->tap(new Redacted4Webhooks\RouteRegistrar());

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

11.16. Install Laravel Reverb version 1.0 instead of @beta

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

Если используете Reverb при выполнении команды по установке Broadcasting, до этого устанавливалась бета-версия Reverb, а теперь же будет устанавливаться версия 1.0

11.16. Include ‘success’ console component

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

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

11.17. Add whereLike clause to query builder

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

PR затрагивает query builder. Для тех, кто через Macroable прописывал дополнительно в builder методы whereLike, whereNotLike, orWhereLike, orWhereNotLike. Теперь все это будет в коробке. 

whereLike($column, $value, $caseSensitive = false): Выполняет запрос LIKE с возможностью учета регистра.  whereNotLike($column, $value, $caseSensitive = false): Выполняет запрос NOT LIKE с возможностью учета регистра.  orWhereLike($column, $value, $caseSensitive = false): Добавляет предложение OR LIKE с дополнительной чувствительностью к регистру  orWhereNotLike($column, $value, $caseSensitive = false): Добавляет предложение OR NOT LIKE с дополнительной чувствительностью к регистру

После этого PR вы сможете добиться того же самого по тому же запросу.

$users = DB::table('users')     ->whereLike('email', 'john.doe@example.com')     ->get();

или для поиска с учетом регистра

$users = DB::table('users')     ->whereLike('email', 'John.Doe@example.com', true)     ->get();

PostgreSQL использует оператор ilike для операций, нечувствительных к регистру, и оператор like для операций, чувствительных к регистру.

MySQL использует оператор like для операций, нечувствительных к регистру, и оператор like binary для операций, чувствительных к регистру.

SQLite использует оператор like для операций, нечувствительных к регистру. Для операций, чувствительных к регистру, SQLite поддерживает оператор glob, который преобразует привязки, заменяя символы _ и %.

SQL Server по умолчанию использует оператор like. Чувствительность к регистру в SQL Server определяется сортировкой базы данных или столбца. Если флаг чувствительности к регистру установлен в значение true, система выдаст исключение.

Также поддержка Postgres с ilike. Все это теперь в коробке. Пожалуйста, пользуйтесь.

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

11.17. Allow microsecond travel

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

Tim Macdonald добавил поддержку микросекунд в travel функционал. Пример:

travel(5)->microseconds()

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


ссылка на оригинал статьи https://habr.com/ru/articles/835574/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *