Цього тижня команда Laravel представила версію 11.35. Серед ключових оновлень: інструменти для парсингу та модифікації URI, можливість вимкнути скорочення тексту помилок в HTTP-клієнті, перетворення HTTP-відповідей у Fluent-екземпляри та багато іншого.
# Парсинг та модифікація URI
Тейлор Отвелл додав клас Uri, який спрощує роботу з адресами та їхніми компонентами.
$uri = Uri::of('https://laravel.com')
->withQuery(['name' => 'Taylor'])
->withPath('/docs/installation')
->withFragment('hello-world');
$uri->scheme();
$uri->host();
$uri->user();
$uri->password();
$uri->path();
$uri->port();
$uri->query()->all();
$uri->query()->has('name');
$uri->query()->missing('name');
$uri->query()->decode();
// Та багато іншого...
return (string) $uri;
Ви також можете отримати екземпляр URI з поточного запиту, іменованих маршрутів або звичайних URL:
$uri = $request->uri();
$uri = Uri::to('/something')->withQuery(...);
$uri = Uri::route('named-route', ['user' => $user]);
Деталі доступні у Pull Request #53731.
# Налаштування скорочення повідомлень про помилки в HTTP-клієнті
Стів Бауман реалізував можливість керувати скороченням тексту у відповідях HTTP-клієнта через конфігурацію завантаження додатка. У колбеку withExceptions() тепер можна змінити ліміт символів або зовсім вимкнути обрізання тексту:
// bootstrap/app.php
use Illuminate\Http\Client\RequestException;
return Application::configure(basePath: dirname(__DIR__))
// ...
->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontTruncateRequestExceptions();
// Або так:
$exceptions->truncateRequestExceptionsAt(260);
})->create();
# Перетворення даних HTTP-відповіді у Fluent-екземпляр
Завдяки внеску Стіва Баумана дані з відповіді HTTP-клієнта тепер можна зручно перетворювати у Fluent-об'єкт:
$fluent = Http::get('https://api.example.com/products/1')->fluent();
$fluent->float('price'); // 420.69
$fluent->collect('colors'); // Collection(['red', 'blue'])
$fluent->boolean('on_sale'); // true
$fluent->integer('current_stock'); // 69
# Трейт Conditionable для Request
Ахмет Імамоглу додав трейт Conditionable до класу HTTP-запиту. Тепер у класах запитів можна використовувати метод when() так само як у query builder:
/**
* Підготовка даних для валідації.
*/
protected function prepareForValidation(): void
{
$this->when($this->input('account_id'),
fn (Request $req, int $accountId) => $req->merge(['account_name' => Account::getName($accountId)]),
fn (Request $req) => $req->merge(['account_name' => null])
)->when($this->input('contact_id'),
fn (Request $req, int $contactId) => $req->merge(['contact_name' => Contact::getName($contactId)]),
fn (Request $req) => $req->merge(['contact_name' => null])
);
}
# Сортування маршрутів у route:list за визначенням
Матьє Тудіско додав можливість сортувати результати команди route:list за параметром definition:
php artisan route:list --sort=definition
Ось як це виглядає на практиці:

# Планувальник завдань: пінгування при успіху або помилці
Лука Кастельнуово додав методи pingOnSuccessIf() та pingOnFailureIf() для планувальника. Це дозволяє системі надсилати запит на вказаний URL лише у разі успішного або невдалого виконання завдання за певної умови:
$pingBackupRun = (bool) config('services.ohdear.tasks.backup:run', false);
$pingBackupRunUrl = config('services.ohdear.tasks.backup:run');
Schedule::command('backup:run')->hourly()
->pingBeforeIf($pingBackupRun, $pingBackupRunUrl . '/starting')
->pingOnSuccessIf($pingBackupRun, $pingBackupRunUrl . '/finished')
->pingOnFailureIf($pingBackupRun, $pingBackupRunUrl . '/failed');
Детальніше у документації Laravel: Pinging URLs.
# Нотатки до релізу
Нижче наведено повний список змін. Різницю між версіями 11.34.0 та 11.35.0 можна переглянути на GitHub. Офіційний changelog містить такі пункти:
# v11.35.0
- [11.x] Підтримка Symfony 7.2 від @crynobone
- [11.x] Виправлення логіки перепідключення до бази даних від @stancl
- [11.x] Покращення тестів від @crynobone
- [11.x] Виправлення
foreignIdFor()для неінкрементних цілочисельних ключів (крім ULID) від @edgrosvenor - [11.x] Дозволено сортування маршрутів за пріоритетністю у
artisan routes:listвід @mathieutu - [11.x] Оновлення повідомлення для команди
schedule:workвід @AbdelElrafa - [11.x] Підтримка автоматичного виявлення реалізацій PSR-17 від @hafezdivandari
- [11.x] Покращення обробки помилок у
ProcessDriverвід @WillTorres10 - [11.x] Виправлення граматики в коментарях від @nexxai
- [11.x] Заміна
get_called_classнаstatic::classвід @fernandokbs - [11.x] Додавання пов'язаної моделі pivot при створенні з атрибутів від @alexwass-lr
- [11.x] Використання послідовного аліасу для
Illuminate\Database\Eloquent\Collectionвід @browner12 - [11.x] Заміна
Collection::make()наnew Collection()від @browner12 - [11.x] Покращення підтримки Enum у
Collectionчерез методиfirstWhere()таvalue()від @crynobone - [11.x] Додавання трейту
ConditionableдоRequestвід @ahmeti - [11.x] Ігнорування health endpoint у режимі технічного обслуговування від @joshmanders
- [11.x] Можливість перетворення
Http\Client\ResponseуFluentвід @stevebauman - Встановлення схеми smtps, якщо
MAIL_ENCRYPTION === tlsвід @danielrona - [11.x] Виправлення
RateLimiterпри викориданні динамічних ключів від @MilesChou - [11.x] Можливість кастомізації або вимкнення скорочення повідомлень
Http\Client\RequestExceptionвід @stevebauman - [11.x] Додавання
pingOnSuccessIfтаpingOnFailureIfдо планувальника від @lucacastelnuovo - [11.x] Додавання класу
Uriвід @taylorotwell - [11.x] Виправлення назв схем у трейті
DatabaseTruncation(PostgreSQL та SQLServer) від @hafezdivandari