nicolopignatelli/valueobjects
Laravel-friendly PHP value objects library that helps you model domain concepts as immutable, self-validating objects (like Email, Money, Url, etc.). Encourages DDD patterns, clearer APIs, and safer data handling with consistent validation and comparison.
Money, Email, UUID, Percentage). It enforces type safety and business logic encapsulation, reducing null checks and invalid state risks.JsonSerializable or Laravel’s Resource classes).Money, UUID). Laravel’s Attribute Casting (v8+) simplifies this.| Risk Area | Mitigation Strategy |
|---|---|
| Performance Overhead | Benchmark serialization/deserialization for high-throughput APIs. |
| Learning Curve | Document team training on value objects vs. entities; pair programming for DDD. |
| Database Schema | Ensure all value objects have castable storage formats (e.g., JSON for arrays). |
| Backward Compatibility | Gradual migration: Start with new features, then refactor legacy models. |
| Tooling Gaps | Extend Laravel Scout, Notifications, or Events if value objects are critical to these. |
OrderItem with Money and TaxRate)?json casting?)Money as {amount: 100, currency: "USD"} vs. raw integers)?ValueObject::from() in validation rules (e.g., Email::from($request->email)).JsonSerializable or Laravel’s with() methods.Email formats).Invoice, UserProfile).string $email) with value objects in existing models.Money).$user->email() → $user->email()->value()).Attribute Casting for cleaner syntax.json columns or separate tables for complex value objects.Money value objects.| Step | Priority | Dependencies | Tools/Techniques |
|---|---|---|---|
| Define Value Objects | High | Domain analysis | Domain Storytelling, Event Storming |
| Update Models | Medium | Value object definitions | Eloquent Casts, Accessors |
| API/Validation | Medium | Value object validation rules | Form Requests, API Resources |
| Database Migration | Low | Model changes | Laravel Migrations, Schema Builder |
| Testing | High | All prior steps | PHPUnit, Pest, Mutation Testing |
| Documentation | Medium | Team onboarding | Markdown, Livewire/Inertia Examples |
Email with invalid format).Percentage must be 0–100).Money $amount vs. int $amount).DateTime value objects.TaxCalculation).| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Invalid Value Object Input | Application crashes or corrupts data | Use try-catch in constructors or validation layers. |
| Database Schema Mismatch | Data loss or corruption | Write migration tests and rollback plans. |
| Serialization Errors | API failures or malformed responses | Use JsonSerializable and test edge cases. |
| Circular References | Memory leaks or infinite loops | Avoid recursive value objects; use __serialize() magic methods. |
| Team Resistance to DDD | Slow adoption, technical debt | Start small; demonstrate ROI with metrics (e.g., fewer bugs). |
How can I help you explore Laravel packages today?