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.
required_if), while reducing manual rule duplication.Illuminate\Foundation\Http\FormRequest with Data objects for validation.Illuminate\Http\Resources\Json\JsonResource with Data objects for serialization.Data objects for type-safe storage/retrieval.create, factory), IDE autocompletion, and static analysis (PHPStan).required_with, prohibited_if) may need explicit overrides in the rules() method to avoid default behavior (e.g., skipping rules for nullable properties).laravel-data:typescript command. May need additional tooling (e.g., Vite, Webpack) for frontend projects.AppServiceProvider) migrate to Data objects?#[Rule('unique:users,email')])?laravel-data:typescript command or a custom solution?FormRequest assertions) adapt to Data objects?Data objects in factories or seeders?Data objects?Data objects via APIs (e.g., JSON:API, GraphQL)?FormRequest validation with type-safe Data objects.JsonResource with Data objects for serialization (supports lazy loading, pagination, and relationships).Data objects for type safety.defer groups for lazy-loaded properties.OptionalProp for compatibility.create, assertValid).Data objects alongside existing FormRequest/JsonResource.Data object).FormRequest to Data object properties (using PHP attributes or rules() method).// Before (FormRequest)
public function rules(): array {
return ['email' => 'required|email'];
}
// After (Data object)
class UserData extends Data {
#[Rule('required|email')]
public string $email;
}
JsonResource with Data objects for responses. Use toArray() or toJson() methods.// Before (JsonResource)
public function toArray($request) {
return ['email' => $this->user->email];
}
// After (Data object)
class UserResponse extends Data {
public function __construct(
public string $email,
) {}
}
php artisan laravel-data:typescript to generate TypeScript interfaces.Data objects using HasData trait or custom casts.use Spatie\LaravelData\Casts\Data;
class User extends Model {
protected $casts = [
'profile' => Data::class,
];
}
spatie/laravel-activitylog).#[DatabaseConstraint('unique')]).FormRequest with Data objects for new features.rules() methods.JsonResource with Data objects for responses.Data objects.Data objects.Data objects, reducing inconsistencies.composer.json (e.g., ^4.23) to avoid surprises.dd($dataObject) to inspect structure.user.profile.email).Data::enableDebugMode() for detailed logs.How can I help you explore Laravel packages today?