Convert Figma logo to code with AI

spatie logolaravel-data

Powerful data objects for Laravel

1,246
209
1,246
12

Top Related Projects

Data transfer objects with batteries included

Quick Overview

Spatie's Laravel Data is a package that helps you create strongly typed data objects in Laravel applications. It provides a structured way to handle data transfer between different parts of your application, ensuring type safety and improving code organization.

Pros

  • Strongly typed data objects for improved code reliability
  • Automatic validation and casting of data
  • Seamless integration with Laravel's ecosystem
  • Supports data transformation and normalization

Cons

  • Learning curve for developers new to the concept
  • May introduce additional complexity for simple data structures
  • Requires PHP 8.0 or higher
  • Can lead to increased boilerplate code in some cases

Code Examples

Creating a simple data object:

use Spatie\LaravelData\Data;

class UserData extends Data
{
    public function __construct(
        public string $name,
        public string $email,
        public ?int $age
    ) {}
}

Using the data object in a controller:

public function store(UserData $userData)
{
    $user = User::create($userData->toArray());
    return response()->json($user);
}

Transforming data with a custom cast:

use Spatie\LaravelData\Attributes\WithCast;
use Spatie\LaravelData\Casts\DateTimeInterfaceCast;

class PostData extends Data
{
    public function __construct(
        public string $title,
        public string $content,
        #[WithCast(DateTimeInterfaceCast::class)]
        public DateTime $publishedAt
    ) {}
}

Getting Started

  1. Install the package via Composer:

    composer require spatie/laravel-data
    
  2. Create a data object by extending the Spatie\LaravelData\Data class:

    use Spatie\LaravelData\Data;
    
    class ProductData extends Data
    {
        public function __construct(
            public string $name,
            public float $price,
            public int $stock
        ) {}
    }
    
  3. Use the data object in your application:

    $productData = new ProductData(
        name: 'Awesome Product',
        price: 19.99,
        stock: 100
    );
    
    // Or create from an array
    $productData = ProductData::from([
        'name' => 'Awesome Product',
        'price' => 19.99,
        'stock' => 100
    ]);
    

Competitor Comparisons

Data transfer objects with batteries included

Pros of data-transfer-object

  • Simpler and more lightweight, with fewer dependencies
  • Can be used in non-Laravel PHP projects
  • Faster performance due to less overhead

Cons of data-transfer-object

  • Less feature-rich compared to laravel-data
  • Lacks built-in validation and casting capabilities
  • No direct integration with Laravel's ecosystem

Code Comparison

data-transfer-object:

class UserData extends DataTransferObject
{
    public string $name;
    public int $age;
}

laravel-data:

class UserData extends Data
{
    public function __construct(
        public string $name,
        public int $age,
    ) {}
}

Both packages provide a way to create structured data objects, but laravel-data offers more advanced features like automatic validation, casting, and integration with Laravel's form requests and API resources. data-transfer-object is more focused on providing a simple, lightweight solution for creating data objects in PHP.

laravel-data is better suited for complex Laravel applications that require extensive data handling and validation, while data-transfer-object is a good choice for simpler projects or non-Laravel PHP applications that need a basic data object structure.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Powerful data objects for Laravel

Latest Version on Packagist Tests PHPStan Check & fix styling Total Downloads

This package enables the creation of rich data objects which can be used in various ways. Using this package you only need to describe your data once:

  • instead of a form request, you can use a data object
  • instead of an API transformer, you can use a data object
  • instead of manually writing a typescript definition, you can use... 🥁 a data object

A laravel-data specific object is just a regular PHP object that extends from Data:

use Spatie\LaravelData\Data;

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

By extending from Data you enable a lot of new functionality like:

  • Automatically transforming data objects into resources (like the Laravel API resources)
  • Transform only the requested parts of data objects with lazy properties
  • Automatically creating data objects from request data and validating them
  • Automatically resolve validation rules for properties within a data object
  • Make it possible to construct a data object from any type you want
  • Add support for automatically validating data objects when creating them
  • Generate TypeScript definitions from your data objects you can use on the frontend
  • Save data objects as properties of an Eloquent model
  • And a lot more ...

Why would you be using this package?

  • You can be sure that data is typed when it leaves your app and comes back again from the frontend which makes a lot less errors
  • You don't have to write the same properties three times (in a resource, in a data transfer object and in request validation)
  • You need to write a lot less of validation rules because they are obvious through PHP's type system
  • You get TypeScript versions of the data objects for free

Are you a visual learner?

In this talk, given at Laracon, you'll see an introduction to Laravel Data.

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Documentation

You will find full documentation on the dedicated documentation site.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.