Skip to main content

Powerful data objects for Laravel

Laravel Data enables you to create rich, type-safe data objects that work seamlessly throughout your entire application. Using this package, you only need to describe your data structure once.

Form Requests

Replace form request classes with data objects that handle validation automatically

API Resources

Transform data objects into JSON responses without writing separate transformer classes

TypeScript Definitions

Generate TypeScript definitions from your data objects for end-to-end type safety

What is a data object?

A Laravel Data object is a regular PHP class that extends from Data. This simple inheritance unlocks powerful functionality:
use Spatie\LaravelData\Data;

class SongData extends Data
{
    public function __construct(
        public string $title,
        public string $artist,
    ) {
    }
}

Key features

By extending from Data, you enable powerful capabilities:

Automatic Transformation

Convert data objects into arrays, JSON, or resources like Laravel API resources

Lazy Properties

Transform only requested parts of data objects with lazy loading support

Request Validation

Create data objects from request data with automatic validation

Flexible Creation

Construct data objects from arrays, models, requests, or any custom type

Eloquent Integration

Save data objects as properties of Eloquent models

TypeScript Generation

Export TypeScript definitions for frontend type safety

Why use Laravel Data?

Ensure data is properly typed when it leaves your app and comes back from the frontend, reducing errors significantly.
Stop writing the same properties three times (in a resource, DTO, and request validation). Define them once.
Many validation rules are obvious through PHP’s type system, so you write fewer explicit rules.
Get TypeScript versions of your data objects automatically generated for your frontend.

Quick example

Here’s how Laravel Data simplifies your controllers. Instead of this:
class PostController
{
    public function store(Request $request)
    {
        $request->validate([
            'title' => ['required', 'string'],
            'content' => ['required', 'string'],
            'status' => ['required', new Enum(PostStatus::class)],
        ]);

        $post = Post::create([
            'title' => $request->input('title'),
            'content' => $request->input('content'),
            'status' => $request->enum('status', PostStatus::class),
        ]);

        return new PostResource($post);
    }
}
You can write this:
class PostController
{
    public function store(PostData $data)
    {
        Post::create($data->toArray());

        return $data;
    }
}
Check out this Laracon talk for a visual introduction to Laravel Data.

Next steps

Requirements

Check if your environment meets the requirements

Installation

Install Laravel Data via Composer

Quickstart

Build your first data object in minutes

GitHub

View source code and contribute