Робота з 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 у вашій логіці додатка