# Custom Namespaces to Organize Your Controllers

By Bobby Iliev, 2021-03-25. https://bobbyiliev.com/post/custom-namespaces-to-organize-your-controllers/

# Introduction

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!

# Prerequisites

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](https://m.do.co/c/2a9bba940f39) 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:

* [How to Install Laravel on DigitalOcean with 1-Click](/post/how-to-install-laravel-on-digitalocean-with-1-click/)

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

* [LaraSail](https://devdojo.com/episode/laravel-on-digital-ocean-with-larasail)

# 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:

```
app/Http/Controllers/Demo/DemoController.php
```

> 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](https://laravel.com/docs/8.x/routing).

# Conclusion

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](https://laravel.com/docs/8.x/controllers)

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

[Getting started with Laravel](https://devdojo.com/course/laravel-7-basics)
