Advanced Eloquent Custom Casts and Value Objects | Mohamed Said       [Skip to content](#main)  [ ![](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png) Mohamed SaidLaravel Backend Engineer ](https://www.msaied.com/public) - [Home](https://www.msaied.com/public)
- [Projects](https://www.msaied.com/public/projects)
- [Articles](https://www.msaied.com/public/articles)
- [Certificates](https://www.msaied.com/public/certificates)
- [About](https://www.msaied.com/public#about)

           [  Contact](https://www.msaied.com/public#contact) Menu 

Menu
----

Close 

 - [HomeStart here](https://www.msaied.com/public)
- [ProjectsCase studies](https://www.msaied.com/public/projects)
- [ArticlesEngineering notes](https://www.msaied.com/public/articles)
- [CertificatesCredentials](https://www.msaied.com/public/certificates)
- [AboutHow I work](https://www.msaied.com/public#about)
- [ContactGet in touch](https://www.msaied.com/public#contact)

  [Start a conversation](https://www.msaied.com/public#contact) [WhatsApp](https://wa.me/201094619204) [Email](mailto:hello@msaied.com) 

 1. [Home](https://www.msaied.com/public)
2. /
3. [Articles](https://www.msaied.com/public/articles)
4. /
5. Advanced Eloquent Casts: Custom Cast Classes, Value Objects, and Inbound-Only Transforms

 Advanced Eloquent Casts: Custom Cast Classes, Value Objects, and Inbound-Only Transforms
=========================================================================================

 Go beyond primitive casts. Learn to build custom Eloquent cast classes that hydrate value objects, handle inbound-only transforms, and keep your models clean without leaking domain logic into the database layer.

 ![](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp) [Mohamed Said](https://www.msaied.com/public#person) Published 5 Jul 2026 · Updated 5 Jul 2026 · 1 min read

ShareCopy linkCopied

 ![Advanced Eloquent Casts: Custom Cast Classes, Value Objects, and Inbound-Only Transforms](https://cdn.msaied.com/367/9c57cfb2f2843dc64aaa6c97bad628af.png) 

  On this page +1. [Why Built-in Casts Fall Short](#why-built-in-casts-fall-short)
2. [Anatomy of a Custom Cast](#anatomy-of-a-custom-cast)
3. [Wiring It Up](#wiring-it-up)
4. [Parameterised Casts](#parameterised-casts)
5. [Inbound-Only Casts](#inbound-only-casts)
6. [Casting to Enums vs. Custom Cast Classes](#casting-to-enums-vs-custom-cast-classes)
7. [Testing Casts in Isolation](#testing-casts-in-isolation)
8. [Key Takeaways](#key-takeaways)

 Why Built-in Casts Fall Short
-----------------------------

Laravel ships with a solid set of primitive casts — `integer`, `boolean`, `array`, `encrypted`, `AsCollection`, and so on. They cover 80% of everyday work. The remaining 20% is where models start accumulating `getXAttribute` / `setXAttribute` pairs, helper methods, and subtle inconsistencies between what goes into the database and what comes out.

Custom cast classes solve this cleanly. They are first-class objects, testable in isolation, and composable across multiple models.

Anatomy of a Custom Cast
------------------------

A cast class implements `CastsAttributes`. The two methods are `get` (hydrate from storage) and `set` (dehydrate to storage).

```php
