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

14

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

Коментарі

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

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

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

PayZephyr
Новини 12 вересня 2026

PayZephyr: Єдиний API для роботи з Stripe, Paystack та PayPal

PayZephyr - Laravel-пакет від Nwaneri Chukwunyere Kenneth, який об'єднує вісім платіжних провайдерів під одним зручним API. Підтримує автоматичне перемикання, захист від подвійної оплати, підписки та повернення коштів.

2
Laravel Telescope
Новини 11 вересня 2026

Artisan-команди для дебагу в Laravel Telescope 5.24.0

Laravel Telescope 5.24.0 додає дві нові Artisan-команди для роботи із записами із терміналу. Тепер можна переглядати запити, винятки, джоби та запити до бази даних без відкриття веб-інтерфейсу, а також отримувати дані у форматі JSON для скриптів та AI-агентів.

3

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

Full Stack Developer (PHP, React, Middle, Middle+)

Full Stack розробник для підтримки та розвитку аналітичного продукту перевірки контрагентів. Робота зі складною бізнес-логікою, базами даних та інтеграцією AI-рішень. Стек: PHP 8.x (Laravel/Symfony), React, MySQL, REST API. Вимоги: 3+ років комерційного досвіду, глибоке розуміння SQL, Git, Docker, CI/CD, Linux, OWASP.

Honeytech Нова
2 дні тому

Senior Software Engineer (Back End / Full Stack)

Розробник Backend/Full Stack на PHP 8.3 та Symfony 7+ для високонавантаженої платформи. Основні задачі: проектування архітектури систем, оптимізація під навантаження, рефакторинг моноліту з виділенням доменних модулів, робота з розподіленими системами (Kafka, Redis). Вимоги: глибокий досвід архітектури продуктів, реляційних БД, асинхронної обробки, DevOps (Docker, k8s, AWS).

Kozak Group Нова
2 дні тому

Magento 2 Full-Stack Developer (part-time)

Magento 2 full-stack розробник. Розробка кастомних модулів Magento 2, робота з PHP 8.x, OOP, архітектурою платформи (DI, плагіни, события, сервісні контракти). Інтеграції з платіжними системами, REST/GraphQL API, оптимізація продуктивності, front-end Luma/RequireJS/KnockoutJS. Вимоги: впевнена практика Magento 2, сильний PHP, розуміння архітектури, production debugging, автономність у веденні складних задач.

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

Laravel Medialibrary

spatie/laravel-medialibrary

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

6,163 11.23.7 13 8

Laravel Query Builder

spatie/laravel-query-builder

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

4,469 7.3.5 13 11