Переход со spatie/laravel-query-builder
Коду, написанному для spatie/laravel-query-builder 7.x, 6.x или 5.x, нужна только смена неймспейса. Файл конфигурации остаётся как есть.
Шаги
Замените пакет:
bashcomposer remove spatie/laravel-query-builder composer require myprogs/query-builderПосмотрите, что осталось изменить:
bashphp artisan query-builder:check-migrationКоманда только читает проект. Она перечисляет каждое упоминание
Spatie\QueryBuilder\вapp,tests,routes,configиdatabaseс файлом, строкой и классом, который нужно использовать вместо него, и проверяет, чтоcomposer.jsonбольше не требует пакет spatie. Она также предупреждает о том, что нужно проверить вручную:- установленные пакеты, которые сами требуют
spatie/laravel-query-builder: они продолжают работать с классами spatie, а не с этим пакетом; - ключи опубликованного
config/query-builder.php, которых этот пакет не знает; - внутренние трейты (
Concerns\*), которые здесь ведут себя иначе; - то, на что опирается код для spatie 6 и чего пакет не сохраняет (см. ниже);
getEloquentBuilder()в классах, наследующихQueryBuilder,AllowedFilterилиAllowedSort, иinclude()в классах, наследующихAllowedInclude(см. Отличия).
Команда завершается с кодом
1, пока есть упоминания или пакет spatie указан в зависимостях, и с0в остальных случаях, поэтому её можно запускать в CI.--path=modules --path=srcпроверяет другие каталоги вместо каталогов по умолчанию.- установленные пакеты, которые сами требуют
Замените неймспейс в коде, например в
app/иtests/:bashgrep -rl 'Spatie\\QueryBuilder' app tests | xargs sed -i '' 's/Spatie\\QueryBuilder/MyProgs\\QueryBuilder/g'В Linux уберите
''после-i. Запустите проверку снова: блокеров быть не должно.Оставьте опубликованный
config/query-builder.phpкак есть: имя файла и все ключи (parameters,delimiter,filter_value_splitting_enabled,suffixes,disable_invalid_*_query_exception,convert_*) совпадают.Если в baseline PHPStan упоминаются классы spatie, пересоздайте его: baseline хранит имена классов экранированными (
Spatie\\\\QueryBuilder), и команда выше его не переписывает.
Всё, что проходит тестовый набор spatie/laravel-query-builder 7.3.6, продолжает работать. Отличия, которые можно заметить, перечислены в разделе Отличия от spatie.
Переход со spatie 6.x и более старых
Переходить сначала на spatie 7 не нужно. Помимо API 7.x пакет принимает:
- массив вместо списка аргументов в
allowedFilters([...]),allowedSorts([...]),allowedIncludes([...]),allowedFields([...]),defaultSort([...])иdefaultSorts([...]), причём массивы и коллекции среди элементов раскрываются на один уровень; - собственные фильтры, сортировки и include без возвращаемого типа
void; SortDirection::DESCENDING/SortDirection::ASCENDINGи'desc'/'asc'вAllowedSort::defaultDirection();AllowedFilter::beginsWithStrict()/endsWithStrict()(старые именаbeginsWith()/endsWith());- разделитель последним аргументом фабрик фильтров (
AllowedFilter::exact('id', null, true, '|')); он действует только на этот фильтр, как и->delimiter('|'); - ключи конфигурации
count_suffix,exists_suffixиdisable_invalid_includes_query_exceptionв опубликованном конфиге.
Не сохранены, и о них сообщает query-builder:check-migration:
- статические сеттеры разделителя (
QueryBuilderRequest::setArrayValueDelimiter()и подобные): это глобальное состояние; используйте ключ конфигурацииdelimiter; - методы коллекций у результата фабрики
AllowedInclude; - разбиение значений по разделителю в
QueryBuilderRequest::filters().
Что не поддерживается
- Пакеты, которые сами указывают в типах классы
Spatie\QueryBuilder\*. Им нужен адаптер или форк. - Код, расширяющий внутренние трейты
spatie/laravel-query-builder.