The default Laravel application structure is fine for getting started. It becomes a problem when a project grows past a certain size and you have thirty controllers in one flat directory, business logic scattered between models and controllers, and no clear answer to "where does this code go?"
Here is the structure we've converged on after several years of building and maintaining production Laravel apps.
The Core Principle: Domain Over Type
Laravel's default structure organizes by technical type — all models together, all controllers together, all jobs together. This works when a project is small. It breaks down when you have 40 models and need to understand how a specific feature works end-to-end, because the relevant code is spread across six directories.
We organize by domain instead. A billing domain contains its models, its jobs, its services, and its events in one place. You open one directory to understand one feature.
Services, Not Fat Models
Business logic goes in service classes, not in models or controllers. Models handle database interaction and relationships. Controllers handle HTTP — they translate a request into a service call and a service result into a response. Services contain the actual business rules.
This sounds obvious but it requires discipline to maintain. The temptation to add one method to a model because "it's just a query" is where the mess starts.
Action Classes for Single Operations
For operations that are called from multiple places — a controller, a console command, a queued job — we use single-method action classes. One class, one public method called execute() or handle(). They're easy to test in isolation and easy to find when something goes wrong.
Form Requests for All Validation
Validation never lives in controllers. Every endpoint that accepts input has a dedicated Form Request class. This keeps controllers readable and makes it obvious where validation rules live when you need to change them.
The Result
Six months in, a new developer can open the codebase and find what they're looking for without a tour. That's the only metric that matters for project structure.