Перетворення значень масиву в екземпляри Enum за допомогою методу mapInto у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 24 квітня, 2025
В роботі з енумами у Laravel новий метод Collection::mapInto робить все просто та зручно, надаючи перший клас підтримки PHP Enums. Дізнайтеся, як ефективно конвертувати сирі дані в типобезпечні екземпляри енумів для зручності обробки користувацького вводу

Робота з enum у Laravel стає простішою завдяки вдосконаленому методу Collection::mapInto, який тепер надає повноцінну підтримку для PHP Enums, спрощуючи конвертацію значень масиву в правильні екземпляри enum

Введення нативних enums у PHP 8.1 суттєво змінило підходи розробників до визначення наборів значень з типобезпекою. Laravel повністю використовує цю можливість, і метод Collection::mapInto тепер пропонує елегантний спосіб перетворення сирих даних у сильно типізовані екземпляри enum — особливо корисно при обробці вхідних даних, які потребують перетворення в case enum

Ось приклад використання методу:

public function store(Request $request)
{
    $request->validate([
        'statuses' => ['array'],
        'statuses.*' => [new Enum(OrderStatus::class)],
    ]);
 
    $statuses = $request
        ->collect('statuses')
        ->mapInto(OrderStatus::class);
 
    if ($statuses->contains(OrderStatus::Urgent)) {
        // Пріоритет для термінових замовлень
    }
}

Цей підхід виявляється особливо потужним у складних бізнес-логіках:

<?php
 
namespace App\Enums;
 
enum Permission: string
{
    case ViewDashboard = 'view_dashboard';
    case ManageUsers = 'manage_users';
    case EditContent = 'edit_content';
    case AccessReports = 'access_reports';
 
    public function isAdminLevel(): bool
    {
        return in_array($this, [
            self::ManageUsers,
            self::AccessReports
        ]);
    }
}
 
class RolePermissionsController extends Controller
{
    public function assign(Request $request)
    {
        $request->validate([
            'permissions' => ['array'],
            'permissions.*' => [new Enum(Permission::class)],
        ]);
 
        // Перетворення рядків у екземпляри Permission enum
        $permissions = $request
            ->collect('permissions')
            ->mapInto(Permission::class);
 
        // Перевірка адміністративних прав
        $requiresAdminPrivileges = $permissions
            ->filter(fn (Permission $permission) => $permission->isAdminLevel())
            ->isNotEmpty();
 
        if ($requiresAdminPrivileges && !$request->user()->isAdmin()) {
            return back()->withErrors([
                'permissions' => 'Необхідні адміністративні права для вибраних дозволів'
            ]);
        }
 
        // Призначення дозволів ролі
        $request->role()->permissions()->sync(
            $permissions->map->value->toArray()
        );
 
        return redirect()->route('roles.show', $request->role)
            ->with('message', 'Дозволи успішно оновлено');
    }
}

Метод mapInto автоматично створює кожен enum, передаючи початкове значення до конструктора класу enum. Для enum з рядковою основою це без зусиль перетворює сирі рядки, такі як 'view_dashboard', у відповідний case enum Permission::ViewDashboard, що забезпечує типобезпеку та дозволяє ефективно використовувати методи enum у вашій логіці додатка