PHP 8.3 Enums &amp; Readonly Properties in Laravel | 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. PHP 8.3+ Typed Enums, Backed Casts, and Readonly Properties in Modern Laravel

 PHP 8.3+ Typed Enums, Backed Casts, and Readonly Properties in Modern Laravel
==============================================================================

 PHP 8.3 and Laravel's native enum support unlock expressive, type-safe domain models. Learn how to combine backed enums, custom Eloquent casts, and readonly properties to eliminate primitive obsession without ceremony.

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

ShareCopy linkCopied

 ![PHP 8.3+ Typed Enums, Backed Casts, and Readonly Properties in Modern Laravel](https://cdn.msaied.com/344/0e6a808cf916b40631d3d362a687baa8.png) 

  On this page +1. [Why Primitive Obsession Still Haunts Laravel Apps](#why-primitive-obsession-still-haunts-laravel-apps)
2. [Defining a Backed Enum with Behaviour](#defining-a-backed-enum-with-behaviour)
3. [Eloquent Enum Casting](#eloquent-enum-casting)
4. [Storing Enum Arrays with a Custom Cast](#storing-enum-arrays-with-a-custom-cast)
5. [Readonly Properties for Immutable Value Objects](#readonly-properties-for-immutable-value-objects)
6. [Enum-Aware Validation Rules](#enum-aware-validation-rules)
7. [Key Takeaways](#key-takeaways)

 Why Primitive Obsession Still Haunts Laravel Apps
-------------------------------------------------

Most Laravel codebases pass raw strings and integers everywhere — `'active'`, `1`, `'usd'`. These primitives carry no type information, require defensive checks at every boundary, and make refactoring risky. PHP 8.1 introduced backed enums; PHP 8.3 tightened the type system further with typed class constants and improved readonly semantics. Laravel has had first-class enum casting since v9. Combining all three gives you domain models that are self-documenting and compiler-verified.

Defining a Backed Enum with Behaviour
-------------------------------------

Don't treat enums as dumb constants. Add methods and implement interfaces directly on the enum.

```php
