spatie/laravel-data
Create rich, typed data objects for Laravel that replace form requests and API transformers. Automatically map from requests, validate with inferred rules, transform to resources (with lazy/partial fields), and generate TypeScript definitions from the same source.
Data objects) separate from business logic, validation, or presentation layers.Lazy properties) for performance-critical APIs, aligning with modern microservices and pagination needs.CamelCaseMapper, SnakeCaseMapper) for API/DB consistency.Data objects). Requires team buy-in for consistency.Data objects requires refactoring, though the package provides tools (e.g., WithData trait) to ease the transition.Data objects?Data objects?Data objects be sufficient?FormRequest validation logic with type-safe Data objects.Resource classes by using Data objects for serialization.Data objects as model properties (e.g., Song::first()->getData()).Data classes.Data class is framework-agnostic and could be used in:
spatie/laravel-data’s underlying logic).Data objects.Data objects.Data objects for validation (e.g., UserData::from($request->all())->validate()).WithData trait on models/requests for quick adoption.Data objects for serialization (e.g., SongData::from($song)->toArray()).Data object methods (e.g., rules()).FormRequest/API Resource classes with Data objects.json_encode/decode polyfills for edge cases.Data objects (e.g., via Laravel’s cache or Redis), but requires explicit implementation.LaravelDataServiceProvider in test cases for config access.composer require spatie/laravel-data.php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider".Data class autocompletion.FormRequest classes with Data objects for validation.// Before: FormRequest
public function rules(): array { return ['email' => 'required|email']; }
// After: Data object
class UserData extends Data {
public function __construct(
#[Validate('required|email')]
public string $email,
) {}
}
API Resource classes with Data objects for responses.// Before: API Resource
public function toArray($request): array { return ['email' => $this->email]; }
// After: Data object
class UserData extends Data {
public function __construct(public string $email) {}
}
// Usage: UserData::from($user)->toArray()
php artisan laravel-data:typescript.WithData trait on Eloquent models for seamless data extraction.class User extends Model {
use WithData;
protected $dataClass = UserData::class;
}
// Usage: $user->getData() returns UserData
Data objects, reducing maintenance overhead for shared logic.Data objects serve as self-documenting contracts, improving onboarding for new developers.Data classes.Data objects for type correctness.Data objects in tests (e.g., UserData::from([])).How can I help you explore Laravel packages today?