Create Rich Data Objects in Laravel
Published on by Paul Redmond
Laravel Data is a package by Spatie that enables the creation of rich data objects which can be used for form requests, data transformers, and more.
🚀 Our newest package, laravel-data, has been released. This one can replace Form Request,s API resources, it will help you avoiding describing data structures multiple times
— Freek Van der Herten 🔭 (@freekmurze) October 28, 2021
📘 Docs: https://t.co/vunXA2XLj8
✍️ Post: https://t.co/rNMU3sjRGU
🏅 Excellent work by @rubenvanassche pic.twitter.com/NDogbo6JUU
The API is simple for data objects but unlocks powerful featured by extending the package's Data
class:
use Spatie\LaravelData\Data; class SongData extends Data{ public function __construct( public string $title, public string $artist, ) { }}
According to the documentation, extending the package's Data
class gives you valuable features for working with data across various aspects of Laravel:
- 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 ...
Here's an example from the documentation of creating a data object from an Eloquent model:
// Create a SongData instance from a modelSongData::from(Song::firstOrFail($id)); // Create data objects, that could possibly be nullSongData::optional(null); // returns null
The Laravel Data package will find the required properties from the model and use them to construct this data object.
A benefit of using this package is that you don't have to write the same properties in multiple places, such as a resource, a data transfer object, and request validation.
The Laravel data package also includes flexible and advanced features:
- Eloquent casting
- Transform data objects to TypeScript definitions
- Casts — transform values into complex types
- Transformers — transform complex values into simple types
- Validation Rule Inferring
- Data Object validation attributes using PHP 8.0 attributes
You can learn more about this package, get full installation instructions, and view the source code on GitHub. Also, the author of this package, Ruben Van Assche, wrote about how to Avoid describing your data multiple times in a Laravel app using laravel-data.