Custom Namespaces to Organize Your Controllers

Created March 25, 2021


In some cases, when you have too many Controllers in your Laravel project, your app/Http/Controllers directory might get cluttered with too many Controllers.

To keep things more organized, you could use custom Laravel namespaces to store your Controllers in different directories inside the app/Http/Controllers directory.

In this tutorial, you will learn how to use a custom namespace for your Laravel Controllers!


Before you start, you would need to have a Laravel application up and running.

I will be using a DigitalOcean Ubuntu Droplet for this demo. If you wish, you can use my affiliate code to get free $100 DigitalOcean credit to spin up your own servers!

If you do not have that yet, you can follow the steps from this tutorial on how to do that:

Or you could use this awesome script to do the installation:

Creating a standard controller

By default, to create a Controller in Laravel, you would run the following artisan command:

php artisan make:controller DemoController --resource

Note: in case that you are not familiar with the --resource flag, all that it does is to create a controller with all methods needed for your CRUD.

By default, this would create your controller inside the app/Http/Controllers/ directory.

Now that we've covered that let's learn how to create a controller in a custom namespace!

Creating a Controller in a custom namespace

In order to create a controller in a custom namespace, you would need to use the following command:

php artisan make:controller Demo/DemoController --resource

This will create your DemoController inside a Demo directory:


Note that we use a slash / to separate our namespace with our controller.

With that, we are actually creating a namespace as well.

This is quite handy as you don't have to stack all of your Controllers directly inside the app/Http/Controllers/ directory but instead organize them in a more suitable for you way.

Let's edit the file and update the index method with a simple return statement. With your text editor of choice, open the app/Http/Controllers/Demo/DemoController.php and update your index method as follows:

    public function index()
        return "Custom Namespaces are awesome!";

Make sure to save the file after the change.

Now that we have our custom namespace in place, let's learn how to set up our routes!

Routing to the custom namespace

In order to define a route for the custom namespace that we've just created, open the routes/web.php file and add the following:

Route::namespace('Demo')->group(function() {


Thanks to the namespace method, we can specify the new custom Demo namespace.

After that, you can add your routes as normal.

Route::namespace('Demo')->group(function() {
    Route::resource('demo', DemoController::class);

For more information on Laravel Routes, make sure to check out the documentation here.


Now you know how to create a Controller in a custom namespace and keep your controllers well organized.

For more information on Laravel controllers, make sure to check out the official docs here:

Laravel Controllers Documentaiton

If you are just getting started with Laravel, make sure to check out this introduction course here:

Getting started with Laravel