Skip to main content
Laravel Data is built to be flexible through a modular system of traits and interfaces. This allows you to create custom base data classes with exactly the functionality you need.

The Base Data Class

The Data class you’ve been using is actually a composition of multiple traits and interfaces:

Available Traits and Interfaces

Each interface and corresponding trait provides specific functionality:
Provides the base functionality to create data objects.Interface: Spatie\LaravelData\Contracts\BaseData
Trait: Spatie\LaravelData\Concerns\BaseData
This is the core functionality that enables:
  • Creating data objects from various sources
  • The from() method
  • Magic creation methods
Provides base functionality to create data collections.Interface: Spatie\LaravelData\Contracts\BaseDataCollectable
Trait: Spatie\LaravelData\Concerns\BaseDataCollectable
Enables collection operations for data objects.
Provides context functionality for includes and wraps.Trait: Spatie\LaravelData\Concerns\ContextableDataManages transformation context like includes, excludes, wraps, etc.
Provides functionality to add includes, excludes, only, and except.Interface: Spatie\LaravelData\Contracts\IncludeableData
Trait: Spatie\LaravelData\Concerns\IncludeableData
Enables:
  • ->include('property')
  • ->exclude('property')
  • ->only('property')
  • ->except('property')
Provides functionality to transform data objects.Interface: Spatie\LaravelData\Contracts\TransformableData
Trait: Spatie\LaravelData\Concerns\TransformableData
Enables:
  • ->toArray()
  • ->toJson()
  • Transformation to various formats
Provides functionality to return data objects as HTTP responses.Interface: Spatie\LaravelData\Contracts\ResponsableData
Trait: Spatie\LaravelData\Concerns\ResponsableData
Allows returning data objects directly from controllers.
Provides functionality to wrap transformed data.Interface: Spatie\LaravelData\Contracts\WrappableData
Trait: Spatie\LaravelData\Concerns\WrappableData
Enables:
  • ->wrap('data')
  • Custom wrapping keys
Provides functionality to append data to transformed payloads.Interface: Spatie\LaravelData\Contracts\AppendableData
Trait: Spatie\LaravelData\Concerns\AppendableData
Enables:
  • ->additional(['key' => 'value'])
  • Appending extra data to responses
Provides functionality to get an empty version of the data object.Interface: Spatie\LaravelData\Contracts\EmptyData
Trait: Spatie\LaravelData\Concerns\EmptyData
Enables:
  • ::empty()
  • Creating empty data objects
Provides functionality to validate data objects.Interface: Spatie\LaravelData\Contracts\ValidateableData
Trait: Spatie\LaravelData\Concerns\ValidateableData
Enables:
  • ::validate($data)
  • ::getValidationRules($data)
  • Automatic validation
Provides functionality for deprecated features.Interface: Spatie\LaravelData\Contracts\DeprecatableData
Trait: Spatie\LaravelData\Concerns\DeprecatableData
Supports backward compatibility features.

Creating Custom Base Classes

You can create your own base data classes with specific functionality:

Example: Minimal Data Class

Create a data class with only creation and transformation:

Example: API Resource Class

Create a data class optimized for API resources:

Example: DTO Class

Create a data class for DTOs without HTTP concerns:

Built-in Custom Classes

The package includes two custom base classes:
  • Resource - Optimized for API resources with transformation and response features
  • Dto - Optimized for data transfer objects with validation
Use these as starting points or create your own custom base classes.