Не только фиксы: разбираем новые хелперы Laravel 12.46 и поддержку Enum в Gate
Привет, коллеги!
На "Laravel News" вышел традиционный релиз-пост. Версии 12.45.1, 12.45.2 и 12.46.0 — это, в основном, точечные фиксы и пара новых хелперов для массивов и коллекций.
Всё это мило и полезно (особенно Arr::onlyValues() — давно ждал подобного синтаксического сахара). Но среди всего этого есть одна небольшая правка, которая мне кажется гораздо более важной, чем просто "новая фича". Речь о том, что метод Gate::has() теперь научился принимать UnitEnum.
Давайте сразу к примеру. Раньше мы проверяли, зарегистрирована ли способность (ability) в Gate, примерно так:
Ключ — строка. А строки, как мы знаем, — источник опечаток и ошибок в рантайме. С появлением в PHP 8.1 Backed Enum (enum со значениями) стало возможным писать так:
Это уже лучше, типобезопаснее. Но метод has(), который проверяет факт регистрации ability, до сих пор работал только со строками. Теперь — и с обычными UnitEnum.
Зачем это нужно?
Представьте, что вы строите модульную систему или пакет, где abilities могут регистрироваться динамически. Вы хотите защититься от попыток вызвать несуществующую ability и иметь единый источник истины для всех разрешений в коде.
Что это меняет?
- Полная типобезопасность. От идеи до проверки — везде работаем с объектами enum. IDE будет подсказывать варианты, статический анализатор (вроде Psalm или PHPStan) сможет отловить несуществующие случаи на этапе проверки кода.
- Рефакторинг становится проще. Переименовали ability в enum? IDE переименует его везде автоматически. Со строками пришлось бы искать-заменять с риском что-то сломать.
- Явный контракт. Enum Abilities становится документацией, которая прямо в коде показывает, какие способности вообще существуют в системе.
Это шаг в сторону более декларативного и надежного кода. Laravel постепенно, но верно, embrace'ит современные возможности PHP, и это радует.
P.S. Про новые хелперы Arr::onlyValues( ) и Collection::containsManyItems( ), можно сказать только то, что это, конечно, тоже приятно. Первый избавляет от велосипеда array_filter($array, fn($value) => in_array($value, $allowedValues)), второй — элегантная замена конструкции $collection->filter(fn(...))->count() > 1.
А вы используете Enum в своих Laravel-проектах? Только для статусов в моделях или для чего-то еще?