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