> ## Documentation Index
> Fetch the complete documentation index at: https://geni.masiting.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Spatie Laravel Data

> Automatic static OpenAPI documentation for Spatie Laravel Data DTOs.

## Overview

[Spatie Laravel Data](https://spatie.be/docs/laravel-data) (`spatie/laravel-data`) is widely used for type-safe Data Transfer Objects (DTOs), request validation, and API resource transformation in Laravel.

Geni provides first-class, opt-in static analysis support for `spatie/laravel-data` (v3 and v4). When a controller action accepts a `Data` class or returns one, Geni automatically generates matching OpenAPI schemas without requiring redundant Form Requests or annotations.

## Request Injection

When a controller action parameter type-hints a class extending `Spatie\LaravelData\Data`:

```php theme={null}
use App\Data\UserData;
use Illuminate\Http\JsonResponse;

class UserController
{
    public function store(UserData $data): JsonResponse
    {
        // ...
    }
}
```

Geni inspects the `UserData` class definition:

```php theme={null}
namespace App\Data;

use Spatie\LaravelData\Attributes\Validation\Email;
use Spatie\LaravelData\Attributes\Validation\Max;
use Spatie\LaravelData\Attributes\Validation\Min;
use Spatie\LaravelData\Attributes\Validation\Required;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Optional;

class UserData extends Data
{
    public function __construct(
        #[Required]
        #[Min(3)]
        #[Max(50)]
        public string $name,

        #[Required]
        #[Email]
        public string $email,

        public ?AddressData $address = null,

        public Optional|string $bio,
    ) {}
}
```

### Inferred Request Body Schema

Geni automatically infers:

* **`name`**: `type: string`, `minLength: 3`, `maxLength: 50`, in `required` array.
* **`email`**: `type: string`, `format: email`, in `required` array.
* **`address`**: Nested object schema or `$ref: '#/components/schemas/AddressData'`, not required (default is null).
* **`bio`**: `type: string`, not required (typed as `Optional`).

## Response Transformation

Geni automatically recognizes Data responses across all common usage patterns:

<CodeGroup>
  ```php Return Type Hint theme={null}
  public function show(): UserData
  {
      return UserData::from($user);
  }
  ```

  ```php Data::from() Call theme={null}
  public function show()
  {
      return UserData::from($user);
  }
  ```

  ```php Constructor Call theme={null}
  public function show()
  {
      return new UserData('Alice', 'alice@example.com');
  }
  ```

  ```php Data::collect() Call theme={null}
  public function index()
  {
      return UserData::collect(User::all());
  }
  ```
</CodeGroup>

When returning `UserData::collect(...)`, Geni documents a 200 response with `type: array` whose items match the `UserData` schema.

## Supported Validation Attributes

Geni statically parses attributes from `Spatie\LaravelData\Attributes\Validation\*`:

| Spatie Attribute                       | JSON Schema Property                                  |
| -------------------------------------- | ----------------------------------------------------- |
| `#[Required]`                          | Added to schema `required` list                       |
| `#[Nullable]`                          | Omitted from schema `required` list                   |
| `#[Min(n)]`                            | `minLength: n` (string) or `minimum: n` (number)      |
| `#[Max(n)]`                            | `maxLength: n` (string) or `maximum: n` (number)      |
| `#[Between(min, max)]`                 | `minimum` and `maximum` / `minLength` and `maxLength` |
| `#[Email]`                             | `format: "email"`                                     |
| `#[Url]`, `#[ActiveUrl]`               | `format: "uri"`                                       |
| `#[Uuid]`                              | `format: "uuid"`                                      |
| `#[Regex('/^[a-z]+$/')]`               | `pattern: "^[a-z]+$"`                                 |
| `#[DataCollectionOf(ItemData::class)]` | Infers item schema for collections                    |

## Zero Runtime Dependency

Geni never requires `spatie/laravel-data` in your production environment. If a project does not use Spatie Data, Geni ignores Data classes with zero runtime impact.
