As Laravel applications grow, managing everything inside the default app/ folder becomes difficult. Controllers, models, services, and views start mixing together, making the project harder to maintain.
That’s why many developers adopt a Modular Architecture in Laravel.
Instead of one big codebase, your application is divided into independent modules such as:
-
User Module
-
Blog Module
-
Product Module
-
Order Module
-
Payment Module
Each module contains its own controllers, models, routes, views, and logic.
In this guide, you will learn how to structure Laravel applications using modules step-by-step.
Why Large Laravel Apps Need Modules
When your Laravel project grows, problems usually appear.
1. Folder Structure Becomes Messy
Default Laravel structure:
app/
├── Http/
│ └── Controllers/
├── Models/
├── Services/
├── Repositories/
After a while, you may have:
Controllers/
├── UserController.php
├── UserProfileController.php
├── UserSettingController.php
├── ProductController.php
├── ProductCategoryController.php
├── ProductInventoryController.php
├── OrderController.php
├── OrderPaymentController.php
It becomes difficult to manage.
2. Teams Work on the Same Files
When multiple developers work together:
-
Merge conflicts increase
-
Code becomes tightly coupled
-
Deployment becomes risky
Modules solve this by separating features.
3. Features Become Hard to Reuse
Without modules:
-
Copy-paste code between projects
-
Hard to extract features
With modules:
You can reuse entire modules like packages.
What is a Laravel Module?
A Module is a self-contained feature of your application.
Example:
User Module
Blog Module
Product Module
Order Module
Each module contains everything needed for that feature.
Example structure:
Modules/
├── User/
│ ├── Controllers/
│ ├── Models/
│ ├── Routes/
│ ├── Views/
│ └── Services/
│
├── Blog/
│ ├── Controllers/
│ ├── Models/
│ ├── Routes/
│ ├── Views/
│ └── Services/
This keeps the application clean and scalable.
Laravel Modules vs Default Laravel Structure
Default Laravel
app/
├── Models
├── Controllers
├── Requests
├── Policies
All features mixed together.
Modular Laravel
Modules/
├── User/
├── Product/
├── Order/
├── Blog/
Each module contains its own MVC structure.
When Should You Use Modules?
Modules are recommended when your application has:
-
Multiple large features
-
Many developers
-
Complex business logic
-
Large codebase
-
Reusable components
Examples:
Good candidates for modules:
-
CRM systems
-
SaaS platforms
-
ERP systems
-
E-commerce applications
-
Large APIs
Best Package for Laravel Modules
The most popular package is:
nWidart Laravel Modules
It provides:
-
Artisan commands
-
Module generators
-
Module routing
-
Module migrations
-
Module service providers
Step 1 — Install Laravel Modules
Inside your Laravel project run:
composer require nwidart/laravel-modules
Step 2 — Publish Configuration
Run:
php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"
This will create:
config/modules.php
Step 3 — Create Your First Module
Run:
php artisan module:make Blog
Now Laravel will generate:
Modules/
└── Blog/
├── Config/
├── Console/
├── Database/
├── Entities/
├── Http/
│ ├── Controllers/
│ └── Middleware/
├── Providers/
├── Resources/
│ ├── views/
│ └── lang/
├── Routes/
│ ├── web.php
│ └── api.php
└── module.json
Your Blog module is ready.
Step 4 — Create a Controller in the Module
Run:
php artisan module:make-controller BlogController Blog
Controller location:
Modules/Blog/Http/Controllers/BlogController.php
Example:
namespace Modules\Blog\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class BlogController extends Controller
{
public function index()
{
return "Blog Module Working";
}
}
Step 5 — Add Routes for the Module
Open:
Modules/Blog/Routes/web.php
Add:
use Illuminate\Support\Facades\Route;
use Modules\Blog\Http\Controllers\BlogController;
Route::get('/blog', [BlogController::class, 'index']);
Visit:
http://localhost:8000/blog
You will see:
Blog Module Working
Step 6 — Create a Model
Run:
php artisan module:make-model Post Blog
Location:
Modules/Blog/Entities/Post.php
Example:
namespace Modules\Blog\Entities;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'title',
'content'
];
}
Step 7 — Create Migration
Run:
php artisan module:make-migration create_posts_table Blog
Then run:
php artisan migrate
Step 8 — Create Module Views
Create file:
Modules/Blog/Resources/views/index.blade.php
Example:
<h1>Blog Module</h1>
<p>Welcome to the Blog Module</p>
Update controller:
public function index()
{
return view('blog::index');
}
Step 9 — Organizing Large Applications
A real application might look like this:
Modules/
├── Auth/
├── User/
├── Role/
├── Product/
├── Order/
├── Payment/
├── Dashboard/
└── Notification/
Each module contains:
Controllers
Models
Routes
Views
Services
Policies
Events
This makes your Laravel application much easier to maintain.
Benefits of Using Modules
1. Better Code Organization
Each feature is isolated.
2. Easier Team Collaboration
Teams can work on separate modules.
3. Reusable Components
Modules can be reused across projects.
4. Cleaner Architecture
Your application becomes easier to scale.
5. Faster Development
Developers can focus on one module at a time.
Best Practices for Laravel Modules
Keep Modules Independent
Avoid tightly coupling modules together.
Use Service Layers
Example:
Modules/Product/Services/ProductService.php
Use Module Migrations
Each module should manage its own database tables.
Separate Business Logic
Keep controllers thin.
Real-World Example Architecture
Example SaaS structure:
Modules/
├── Auth
├── User
├── Subscription
├── Billing
├── Product
├── Order
├── Notification
└── Report
Each team can maintain their own modules.
Common Mistakes Developers Make
Putting Everything in Controllers
Controllers should only handle requests.
Ignoring Module Boundaries
Avoid accessing other module files directly.
Not Using Service Classes
Complex logic should live in services.
Final Thoughts
If you are building small Laravel applications, the default structure works well.
But once your project grows, switching to Modular Architecture can drastically improve:
-
Maintainability
-
Team collaboration
-
Code organization
-
Scalability
Instead of one huge codebase, your Laravel application becomes a collection of well-organized modules.

