---
title: "Laravel 13.20 отримав власну обробку зображень"
url: https://laravelukraine.com/blog/laravel-1320-otrimav-vlasnu-obrobku-zobrazen
date: 2026-07-16
source: https://laravel-news.com/laravel-13-20-0?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+laravelnews
---

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

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

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

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

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

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

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

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

```php
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');
```

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

```php
// Трансформації
$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();
```

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

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

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

```php
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 є рекомендованою, а не обов'язковою залежністю, тому потрібно встановити її окремо:

```bash
composer require intervention/image
```

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

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

```php
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` дозволяє встановити окремий префікс:

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

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

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

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

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

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

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

```php
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 при оновленні.
