Download the PHP package skiexx/laravel-data-scramble without Composer
On this page you can find all versions of the php package skiexx/laravel-data-scramble. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download skiexx/laravel-data-scramble
More information about skiexx/laravel-data-scramble
Files in skiexx/laravel-data-scramble
Package laravel-data-scramble
Short Description Free Scramble extension for automatic OpenAPI schema generation from spatie/laravel-data classes
License MIT
Homepage https://github.com/skiexx/laravel-data-scramble
Informations about the package laravel-data-scramble
Laravel Data Scramble
Demo-проект
Бесплатное расширение для dedoc/scramble, которое автоматически генерирует OpenAPI-схемы из классов spatie/laravel-data.
Пакет анализирует ваши Data, Resource и Dto классы, используемые как входные параметры контроллеров (вместо FormRequest) и как возвращаемые типы (вместо JsonResource), и строит полноценную OpenAPI-документацию для каждого маршрута.
Возможности
- Автоматический парсинг
Data,Resource,Dtoклассов - Поддержка всех скалярных типов PHP:
string,int,float,bool,array - Поддержка
Carbon,DateTime,DateTimeImmutable,DateInterval - Поддержка backed enum (
stringиint) - Вложенные Data-объекты с автоматическим созданием
$ref-ссылок в#/components/schemas/ - Коллекции Data-объектов (
Data[],#[DataCollectionOf]) - Маппинг 20+ атрибутов валидации spatie/laravel-data в OpenAPI-ограничения
- Поддержка переименования свойств через
#[MapOutputName],#[MapInputName],#[MapName] - Поддержка
SnakeCaseMapper,CamelCaseMapperи пользовательских маперов - Обработка
nullable,optional,default,computed,hidden,lazyсвойств - Интерфейс
OpenApiSchemaдля полностью ручного определения схемы любого класса - Трейт
HasOpenApiSchemaдля автогенерации схемы из Data-класса - Набор трейтов-форматов (
StringFormat,UuidFormat,EmailFormatи др.) - Атрибут
#[ResponseData]для описания ответов анонимныхJsonResource - Поддержка пагинации (LengthAwarePaginator, CursorPaginator) с meta/links
Требования
- PHP ^8.4
- Laravel ^12.0
- spatie/laravel-data ^4.0
- dedoc/scramble ^0.13
Установка
Сервис-провайдер регистрируется автоматически через Laravel auto-discovery. Расширение Scramble также регистрируется автоматически при загрузке пакета.
Публикация конфигурации (опционально)
Файл конфигурации будет создан в config/skiexx-data-scramble.php.
Быстрый старт
После установки пакет начинает работать сразу. Никаких дополнительных настроек не требуется.
Пример контроллера
Пример Data-класса
Этот класс автоматически сгенерирует OpenAPI-схему:
Конфигурация
Поддерживаемые типы
Скалярные типы
| PHP-тип | OpenAPI-тип |
|---|---|
string |
type: string |
int |
type: integer |
float |
type: number |
bool |
type: boolean |
array |
type: array |
mixed |
без ограничений |
Даты
| PHP-тип | OpenAPI |
|---|---|
Carbon\Carbon |
type: string, format: date-time |
Carbon\CarbonImmutable |
type: string, format: date-time |
DateTime |
type: string, format: date-time |
DateTimeImmutable |
type: string, format: date-time |
DateTimeInterface |
type: string, format: date-time |
DateInterval |
type: string, format: duration |
Перечисления (Enum)
Backed enum автоматически преобразуется в соответствующий тип с перечислением допустимых значений:
Результат:
Для int-backed enum будет использован type: integer.
Вложенные Data-объекты
Вложенные объекты автоматически создают $ref-ссылки в #/components/schemas/:
Результат:
Коллекции Data-объектов
Результат:
Маппинг атрибутов валидации
Пакет автоматически преобразует атрибуты валидации spatie/laravel-data в соответствующие ограничения OpenAPI:
Ограничения размера
| Атрибут | string | integer/number | array |
|---|---|---|---|
#[Min(n)] |
minLength: n |
minimum: n |
minItems: n |
#[Max(n)] |
maxLength: n |
maximum: n |
maxItems: n |
#[Between(a,b)] |
minLength + maxLength |
minimum + maximum |
minItems + maxItems |
#[Size(n)] |
minLength = maxLength = n |
minimum = maximum = n |
minItems = maxItems = n |
Форматы
| Атрибут | OpenAPI |
|---|---|
#[Email] |
format: email |
#[Url] |
format: uri |
#[Uuid] |
format: uuid |
#[Ulid] |
format: ulid |
#[IP] |
format: ip |
#[IPv4] |
format: ipv4 |
#[IPv6] |
format: ipv6 |
#[Date] |
format: date |
#[Json] |
contentMediaType: application/json |
#[Image] |
format: binary |
#[File] |
format: binary |
Паттерны
| Атрибут | OpenAPI pattern |
|---|---|
#[Regex('/pat/')] |
значение регулярного выражения |
#[Alpha] |
^[a-zA-Z]+$ |
#[AlphaDash] |
^[a-zA-Z0-9_-]+$ |
#[AlphaNumeric] |
^[a-zA-Z0-9]+$ |
#[Lowercase] |
^[a-z]+$ |
#[Uppercase] |
^[A-Z]+$ |
#[Digits(n)] |
^\d{n}$ |
#[DigitsBetween(a,b)] |
^\d{a,b}$ |
#[StartsWith('a','b')] |
^(a\|b) |
#[EndsWith('a','b')] |
(a\|b)$ |
Прочие
| Атрибут | Эффект |
|---|---|
#[Nullable] |
nullable: true |
#[MultipleOf(n)] |
расширение x-multipleOf: n (для number) |
Атрибуты без прямого аналога в OpenAPI (Exists, Unique, Same, Different, Confirmed и др.) молча пропускаются.
Переименование свойств
Пакет полностью поддерживает механизм маппинга имен spatie/laravel-data.
На уровне класса
На уровне свойства
Поддерживаемые маперы
SnakeCaseMapper--camelCase->snake_caseCamelCaseMapper--snake_case->camelCase#[MapName('custom_name')]-- комбинированный маппинг input + output#[MapInputName('name')]-- маппинг только для входных данных#[MapOutputName('name')]-- маппинг только для выходных данных- Любой пользовательский мапер, реализующий контракт laravel-data
Обработка специальных свойств
Nullable
Default-значения
Hidden
Поведение настраивается через skip_hidden в конфигурации.
Computed
Свойство fullName получит readOnly: true в OpenAPI-схеме. Поведение настраивается через computed_as_readonly.
Lazy
Lazy-свойства по умолчанию считаются необязательными. Поведение настраивается через lazy_as_optional.
Интерфейс OpenApiSchema
Для случаев, когда автоматическая генерация схемы не подходит, вы можете определить схему вручную через интерфейс OpenApiSchema.
Ручное определение схемы
Этот интерфейс можно повесить на любой класс -- он не обязан наследовать Data. Расширение Scramble распознает его автоматически.
Автогенерация через HasOpenApiSchema
Если класс наследует Data и вы хотите реализовать OpenApiSchema без ручного описания всех свойств, используйте трейт HasOpenApiSchema:
Трейт автоматически генерирует массив схемы на основе свойств класса. Это полезно, когда вы хотите, чтобы другие части вашего приложения могли вызвать UserData::openApiSchema() для получения схемы программно.
Трейты форматов
Пакет предоставляет набор трейтов, которые можно использовать на классах, реализующих OpenApiSchema, для стандартных типов:
| Трейт | OpenAPI type |
OpenAPI format |
|---|---|---|
StringFormat |
string |
-- |
IntegerFormat |
integer |
-- |
NumberFormat |
number |
-- |
BooleanFormat |
boolean |
-- |
ArrayFormat |
array |
-- |
DateFormat |
string |
date-time |
UuidFormat |
string |
uuid |
EmailFormat |
string |
email |
Пример использования
Результат:
Data-классы как входные параметры контроллера
Пакет автоматически распознает Data-классы, используемые как параметры методов контроллера, и правильно генерирует OpenAPI-параметры:
- GET/DELETE/HEAD — свойства Data-класса отображаются как query parameters
- POST/PUT/PATCH — свойства Data-класса отображаются как request body (
application/json) #[FromRouteParameter]— свойства отображаются как path parameters
Пример
Результат — query parameters:
Для POST-запросов
Результат — request body (application/json).
Поддержка #[FromRouteParameter]
Используйте встроенный атрибут laravel-data для свойств, которые берутся из маршрута:
Результат:
Свойство userId не попадает в body — оно отображается как path parameter с именем user (из атрибута #[FromRouteParameter('user')]).
Поддержка #[FromRouteParameterProperty]
Для получения свойства модели из route parameter:
Свойства с #[FromRouteParameterProperty] также исключаются из query/body и не попадают в документацию как параметры запроса.
Маппинг имен для входных параметров
При использовании #[MapInputName] или #[MapName], имена параметров в OpenAPI будут соответствовать маппингу:
Атрибут ResponseData
Когда контроллер возвращает анонимный JsonResource для обертки ответа в { "data": ... }, Scramble не может определить реальный тип данных. Атрибут #[ResponseData] решает эту проблему.
Проблема
Решение
Параметры атрибута
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
dataClass |
string | (обязательный) | FQCN Data-класса |
collection |
bool | false |
Массив объектов { "data": [{...}] } |
paginated |
bool | false |
LengthAwarePaginator с meta + links |
cursorPaginated |
bool | false |
CursorPaginator с meta |
status |
int | 200 |
HTTP status code (например 201 для POST Create) |
wrapped |
bool | true |
Обертка { "data": ... }, для paginated всегда true |
Примеры использования
Одиночный объект
Результат:
Коллекция
Результат:
Пагинация (LengthAwarePaginator)
Результат включает полную структуру пагинации Laravel:
Cursor-пагинация
Результат:
Кастомный status code
Без обертки
Если ответ не обернут в { "data": ... }:
Результат -- прямая ссылка на схему без обертки:
Для коллекции без обертки:
Результат:
Примечание: для
paginatedиcursorPaginatedпараметрwrappedигнорируется -- обертка сdata,metaиlinksприменяется всегда, так как это стандартный формат ответа Laravel-пагинатора.
Продвинутая настройка
Ручная регистрация расширения
Если вам нужно контролировать момент регистрации или регистрировать расширение только для определенного API:
Подмена резолверов
Если вам нужно изменить логику генерации схемы, вы можете создать собственное расширение, наследующее LaravelDataTypeToSchemaExtension:
Зарегистрируйте своё расширение:
Подмена ValidationAttributeMap
Для добавления поддержки собственных атрибутов валидации или изменения маппинга существующих:
Собственный DataClassSchemaResolver
Для полного контроля над процессом генерации схемы:
И используйте его в своем расширении:
Использование с несколькими API Scramble
Если вы используете несколько API-документаций в Scramble:
Разработка
Docker-окружение
Проект включает Docker-конфигурацию для разработки без локальной установки PHP:
Стандарты кода
- PSR-12 через Laravel Pint
declare(strict_types=1)во всех PHP-файлах- Тесты на Pest
Архитектура
Как это работает
-
Scramble при генерации документации вызывает
shouldHandle()на каждом расширении для каждого типа, найденного в контроллерах. -
LaravelDataTypeToSchemaExtensionпроверяет, является ли тип наследникомBaseData(Data, Resource, Dto) или реализуетOpenApiSchema. -
DataClassSchemaResolverполучает метаданные класса черезDataConfig::getDataClass()и для каждого свойства:- Проверяет, не скрыто ли оно (
#[Hidden]) - Определяет имя через
NameMappingResolver(с учетом#[MapOutputName]) - Определяет тип через
PropertyTypeResolver(скаляры, даты, enum, вложенные Data) - Применяет ограничения через
ValidationConstraintResolver(Min, Max, Email и др.) - Обрабатывает nullable, lazy, computed, default
- Проверяет, не скрыто ли оно (
-
reference()создает$ref-ссылку черезClassBasedReference, чтобы вложенные объекты не дублировались inline, а были вынесены в#/components/schemas/. ResponseDataOperationExtensionработает на уровне операций (послеResponseExtension): читает#[ResponseData]атрибут с метода контроллера и заменяет response schema, которую Scramble сгенерировал для анонимногоJsonResource, на правильную схему с указанным Data-классом, оберткой и пагинацией.
Лицензия
MIT
All versions of laravel-data-scramble with dependencies
spatie/laravel-package-tools Version ^1.16
illuminate/contracts Version ^12.0
dedoc/scramble Version ^0.13
spatie/laravel-data Version ^4.0