Атрибути Singleton та Scoped контейнера у Laravel 12.21

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 24 липня, 2025
Видання Laravel 12.21.0 приносить безліч захоплюючих нововведень, серед яких атрибути singleton та scoped, новий метод для перевірки значення між двома колонками та можливість суворої валідації числових і логічних даних. Хочете дізнатися більше про ці корисні функції та те, як вони можуть полегшити вашу роботу з Laravel? Читайте далі!

Команда Laravel випустила версію 12.21.0, що включає атрибути singleton та scoped для контейнера, метод у запитах для перевірки, чи знаходиться значення між двома колонками, сувору перевірку чисел та булевих значень і багато іншого:

# Атрибути Singleton та Scoped для Контейнера

@riasvdv додав два атрибути PHP, які можна безпосередньо використовувати в класах, що розв'язуються через контейнер, без потреби в ручній реєстрації як scoped або singleton:

use Illuminate\Container\Attributes\Singleton;
use Illuminate\Container\Attributes\Scoped;

#[Singleton]
class MyService
{
}

#[Scoped]
class MyService
{
}

Докладніше про singleton та scoped singleton дивіться в документації Laravel.

# Перевірка, чи Значення Між Двома Колонками у Запитах

@DarkGhostHunter запропонував метод whereValueBetween() для перевірки, чи лежить значення між двома колонками в запитах:

Цей PR дозволяє розробнику перевіряти, чи належить певне значення між двома колонками через Query Builder.

Це доповнює методи whereBetween() та whereColumnsBetween(), оскільки вони не можуть перевіряти, чи значення (такі як ціле число або таймстемп) лежить між колонками. Розробник повинен самостійно привести значення або значення колонок, як і з попередніми методами.

use App\Models\Post;

// До
Post::whereRaw('? between "visible_from" and "visible_to"', now())->get();
Post::where('visible_from', '<=', now())->where('visible_to', '>=', now())->get();

// Після
Post::whereValueBetween(now(), ['visible_from', 'visible_to'])->get();

Чотири пов'язані методи Query Builder дивіться в Pull Request #56119:

# Глобальне Вимкнення Відношень у Фабриках

Luke Kuzmish вніс можливість відключити створення батьківських відношень у фабриках за замовчуванням. Цю функцію можна використовувати для забезпечення того, щоб не створювалися дані відношень. Для цього використовуйте статичні методи dontExpandRelationshipsByDefault() та expandRelationshipsByDefault() у фабриці:

public function test_has_one_editor_permission_returns_true(): void
{
    UserPermissionFactory::dontExpandRelationshipsByDefault();

    $collection = new UserPermissionCollection([
        UserPermission::factory()
            ->withoutParents()
            ->make([
                'type' => 'viewer',
                'company_id' => 2,
                'product_id' => 789,
            ]),
        UserPermission::factory()
            ->withoutParents()
            ->make([
                'type' => 'editor',
                'company_id' => 2,
                'product_id' => 432,
            ]),
    ]);

    $result = $collection->hasEditorForCompany(2);

    $this->assertTrue($result);
}

Деталі дивіться в Pull Request #56154.

# Отримання URI як Instance Stringable

@Kyrch додав метод toStringable() для отримання URI як Stringable instance:

// До
Str::of(Uri::of('http://localhost')->withScheme('https'));

// Після
Uri::of('http://localhost')->withScheme('https')->toStringable();

# Сувора Перевірка Чисел та Булевих Значень

Peter Fox додав сувору перевірку чисел та булевих значень, яка додатково перевіряє тип значення під час валідації:

use Illuminate\Support\Facades\Validator;

// Числове
Validator::make(['foo' => '1'], ['foo' => 'numeric:strict']); // не проходить
Validator::make(['foo' => 1], ['foo' => 'numeric:strict']); // проходить

// Булеве
Validator::make(['foo' => true], ['foo' => 'boolean:strict']); // проходить
Validator::make(['foo' => '1'], ['foo' => 'boolean:strict']); // не проходить

Документацію оновлено щодо булевих та числових правил.

# Методи для Перевірки Порожності

Christian Worreschk додав методи isEmpty() та isNotEmpty() до класу Fluent для визначення, чи є об'єкт порожнім:

$fluent = new Fluent([
    'name' => 'Laravel News',
    'url' => 'https://laravel-news.com',
]);

$fluent->isEmpty();    // false
$fluent->isNotEmpty(); // true

new Fluent()->isEmpty(); // true
new Fluent()->isNotEmpty(); // false

# Примітки до Випуску

Повний перелік нових можливостей та оновлень дивіться нижче, а також порівняння версій 12.20.0 та 12.21.0 на GitHub. Ці примітки безпосередньо з журналу змін:

# v12.21.0