Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 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

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

Коментарі

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

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

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

Filament v5.10.0
Новини 12 жовтня 2026

Filament v5.10.0: сітка в rich editor, скелетони таблиць і десятки виправлень

Вийшов Filament v5.10.0: елементи керування сіткою в rich editor, допоміжний контент для віджетів-графіків, скелетони завантаження таблиць, submitOnCompletion() для OneTimeCodeInput та багато виправлень авторизації, доступності й стану.

18
Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

16

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

Kredyt Kapital
19 днів тому

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+.

Middle PHP Developer

Розробка та підтримка додатків і мікросервісів на PHP, створення REST API, рефакторинг і оптимізація коду, інтеграція зі сторонніми сервісами. Основний стек: PHP від 3 років, Laravel або Symfony, MySQL/PostgreSQL, Redis, WebSocket. Потрібні знання SOLID, MVC та патернів проєктування, англійська на рівні читання технічної документації. Бажано досвід з мікросервісами, тестуванням (PHPUnit), чергами (RabbitMQ, Kafka) та React або Vue.

Futurra Group Нова
3 дні тому

Junior/Middle Full-stack Developer (PHP)

Розробка та підтримка вебчастини VPN-продукту на PHP та Laravel: новий функціонал, bug fixes, рефакторинг, інтеграції із зовнішніми API і платіжними системами, запуск нових сайтів і сервісів. Значна частина роботи стосується технічного SEO: швидкість, індексація, метадані, sitemap, Core Web Vitals. Стек: PHP 8.x, Laravel, MySQL, Redis, Vue 3, Docker, Nginx. Потрібен досвід роботи з PHP від 1 року, базові знання Linux, Git і REST API, практика з AI-інструментами розробки.

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

Laravel Medialibrary

spatie/laravel-medialibrary

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

6,164 11.23.9 13 8

Laravel Query Builder

spatie/laravel-query-builder

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

4,472 7.3.5 13 11