Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 16 липня 2026

Laravel 13.20 отримав власну обробку зображень

Laravel 13.20.0 представляє власний компонент для обробки зображень із незмінним API на основі драйверів, який дозволяє трансформувати зображення з файлових завантажень, сховища, URL або байтів. Реліз також включає атрибут #[WithoutMiddleware] для контролерів, виділений префікс сесій для Redis та низку доповнень для Eloquent і черг.

Власна обробка зображень через Image-фасад

Laravel 13.20 представляє компонент Illuminate\Image, який обробляє зміну розміру, обрізання, конвертацію форматів та збереження без використання сторонніх бібліотек-обгорток.

Зображення є незмінними: кожна трансформація повертає новий екземпляр, а всі перетворення застосовуються лише тоді, коли ви запитуєте результат.

Найчастіше робота починається з завантаження файлу. Метод Request::image() повертає екземпляр Image для вказаного ключа файлу або null, якщо ключ не містить завантаженого файлу:

$request->image('avatar')
    ->cover(200, 200)
    ->toWebp()
    ->store('avatars');

Також можна створити зображення зі шляху, URL, сирих байтів, base64 або диска сховища:

Image::fromPath('/path/to/photo.jpg');
Image::fromUrl('https://example.com/photo.jpg');
Image::fromBytes($bytes);
Image::fromStorage('photos/avatar.jpg', 's3');
Storage::disk('s3')->image('photos/avatar.jpg');

Усі методи трансформації, параметри виводу та інспекції доступні на екземплярі:

// Трансформації
$image->cover(200, 200);
$image->contain(800, 600);
$image->crop(200, 200);
$image->resize(1024, 768);
$image->scale(1200, 800);
$image->rotate(90);
$image->blur(10);
$image->sharpen(10);
$image->grayscale();
$image->flip();
$image->flop();
$image->orient(); // Застосовує EXIF-обертання

// Формат виводу та якість
$image->toWebp();
$image->toJpg()->quality(80);
$image->optimize(); // WebP з якістю 70
$image->optimize('jpg', 85);

// Читання та інспекція
$image->toBytes();
$image->toBase64();
$image->toDataUri();
$image->width();
$image->height();
$image->dimensions();
$image->mimeType();
$image->extension();

Оскільки екземпляри незмінні, можна створювати кілька варіантів від одного вихідного зображення:

$image = $request->image('photo');
$image->cover(200, 200)->toWebp()->store('thumbnails');
$image->grayscale()->toWebp()->store('grayscale');

Компонент постачається з двома драйверами на основі Intervention Image v4: GD та Imagick. Можна обирати драйвер для кожного зображення окремо, а фасад Image дозволяє перевизначати обробку конкретних трансформацій:

use Illuminate\Image\Transformations\Sharpen;

// Вибір драйвера для конкретного зображення
$image->using('imagick');
$image->usingGd();
$image->usingImagick();

// Перевизначення обробки трансформації драйвером
Image::transformUsing('gd', Sharpen::class, function ($image, Sharpen $sharpen) {
    // Власна обробка sharpen для GD-драйвера
    return $image;
});

Intervention Image є рекомендованою, а не обов'язковою залежністю, тому потрібно встановити її окремо:

composer require intervention/image

Атрибут #[WithoutMiddleware] для контролерів

Атрибути маршрутизації отримали доповнення до #[Middleware]. Якщо останній прикріплює middleware до класу чи методу контролера, то #[WithoutMiddleware] виключає його, забезпечуючи функціонал "виключення middleware" на рівні атрибутів:

use App\Http\Middleware\EnsureTokenIsValid;
use Illuminate\Routing\Controllers\Attributes\Middleware;
use Illuminate\Routing\Controllers\Attributes\WithoutMiddleware;

#[Middleware(EnsureTokenIsValid::class)]
class UserController
{
    public function index()
    {
        // Middleware застосовується тут
    }

    #[WithoutMiddleware(EnsureTokenIsValid::class)]
    public function profile()
    {
        // Але не тут
    }
}

Збіг використовує ReflectionAttribute::IS_INSTANCEOF, тому підкласи middleware також виключаються.

Окремий префікс для сесій у Redis

Додатки, які вказують SESSION_DRIVER та CACHE_STORE на Redis, до цього часу успадковували префікс кешу для сесій, що ускладнювало виділення ключів сесій при очищенні або налагодженні спільного сховища. Нова опція prefix у config/session.php дозволяє встановити окремий префікс:

'prefix' => env('SESSION_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-session-'),

Сховище кешу клонується перед застосуванням префікса сесії, тому його встановлення не впливає на ключі кешу. Опція є опціональною та відповідає існуючому налаштуванню session.connection.

Тихе масове збільшення в Eloquent

Eloquent уже мав методи incrementQuietly() та decrementQuietly() для окремих стовпців. Цей реліз заповнює прогалину багатостовпцевих операцій методами incrementEachQuietly() та decrementEachQuietly(), які оновлюють кілька стовпців одразу без запуску подій моделі:

$user->incrementEachQuietly(['posts_count' => 1, 'points' => 10]);
$user->decrementEachQuietly(['credits' => 3, 'tokens' => 2]);

Enum як ключі WithoutOverlapping у чергах

Middleware завдань WithoutOverlapping тепер приймає PHP enum як ключ, тому завдання з перерахованим значенням більше не потребують ручного перетворення в рядок:

class UpdateCategory implements ShouldQueue
{
    use Queueable;

    public function __construct(protected Category $category) {}

    public function middleware(): array
    {
        return [new WithoutOverlapping($this->category)];
    }
}

Зміна зворотно сумісна з існуючими рядковими ключами.

Інші виправлення та покращення

  • Додано callback-функції beforePushing() та afterPushing() для QueueFake, а MailFake::assertQueuedTimes() тепер публічний
  • Метод assertEmpty() доданий до фасаду Storage, а використання пам'яті тепер повідомляється в події WorkerStopping
  • Команда make:migration тепер генерує впорядковані timestamp-префікси без колізій
  • Атрибут #[SensitiveParameter] застосовується до параметрів із секретами, приховуючи їх зі stack trace
  • Параметр capitalize для методу Stringable::initials()
  • Str::containsAll() більше не повертає true для порожнього масиву пошукових елементів, а Number::forHumans() та abbreviate() більше не повертають -0 для малих від'ємних значень
  • Виправлення для BelongsToMany::touch() коли пов'язаний ключ не є id, TrustProxies з at:* та кількома проксі, і providesTemporaryUploadUrls() на S3-драйвері

Примітки щодо оновлення

Для типових додатків критичних змін не очікується. Драйвери компонента зображень залежать від intervention/image (^4.0), який є рекомендованим пакетом, тому встановіть його перед використанням фасаду Image. Переглядайте changelog для деталей кожного PR при оновленні.

15

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Новини 27 жовтня 2026

Filament v5.11.0: поля й віджети на React, Vue і Svelte та жорсткіший захист Livewire

Filament v5.11.0 дозволяє писати власні поля форм, компоненти схем і віджети на React, Vue, Svelte або чистому JavaScript. Паралельно v5.11.0 і v4.16.0 закривають для клієнта внутрішні Livewire-методи та стан і додають опційні ліміти для репітерів і пагінації таблиць.

2
Новини 27 жовтня 2026

Livewire 4.4.8 закриває обхід #[Authorize], а NativePHP Mobile - сім вразливостей

Livewire 4.4.8 виправляє GHSA-mhf7-xp6r-6qrc (CVSS 6.5): атрибут #[Authorize] можна було обійти й виконати дію над чужим записом. Того ж тижня NativePHP опублікувала сім попереджень для NativePHP for Mobile - виправлення в nativephp/mobile 4.6.1 і 3.3.11, але до користувачів вони дійдуть лише з новою збіркою застосунку.

1

Вакансії за темою

Intetics
7 днів тому

Senior Full-Stack PHP Developer (Laravel + React/Vue)

Senior Full-Stack PHP розробник створює й підтримує масштабовані веб-застосунки: бекенд на Laravel та фронтенд на React або Vue. Відповідає за архітектурні рішення (дизайн сервісів, моделювання даних, кешування, черги), проєктує REST API та інтеграції, рефакторить legacy-код і оптимізує запити. Вимоги: 5+ років досвіду з сучасним PHP 8.x, 3+ роки з Laravel, 3+ роки з React або Vue, сильний TypeScript, досвід з Redis і чергами, автотести та CI/CD.

Kredyt Kapital
30 днів тому

Middle Full-Stack Developer (PHP / Laravel / Vue / React)

Middle Full-Stack Developer для розробки внутрішніх IT-продуктів. Основний стек: PHP 8.3+, Laravel, PostgreSQL, REST API, Vue.js/React. Розробник займатиметься backend (бізнес-логіка, Eloquent, Jobs/Queues) і frontend (компоненти, інтерфейси), інтеграціями та оптимізацією. Вимоги: 2-3+ років комерційного досвіду з PHP, 2+ років практики з Laravel, впевнене знання PostgreSQL, Git, JavaScript ES6+.

Backend Software Developer (PHP / Go)

Розробник бекенду буде вести функції повного циклу: проєктування, розробка, деплой і підтримка в продакшені, а також проєктування архітектури сервісів на стороні сервера. Основний стек: PHP 7+ із Symfony та Go, бази MySQL, MongoDB, Redis, брокер RabbitMQ, інфраструктура GitLab CI, HAProxy, Nginx на Linux. Від кандидата вимагаються знання SDLC, DDD/TDD, досвід роботи з AI-асистованою розробкою.

Пакети за темою

Laravel Medialibrary

spatie/laravel-medialibrary

Пакет для асоціювання файлів з Eloquent-моделями. Надає зручний інтерфейс для управління медіа-файлами, пов'язаними з вашими моделями бази даних.

6,171 11.23.11 13 8

Laravel Query Builder

spatie/laravel-query-builder

Легко будуйте Eloquent-запити на основі запитів від API.

4,470 7.3.7 13 11