Laravel: Organizing your routes into several files

Not everything must be on a wall of routes in your routes file.

Simple applications may use the or files to describe their routes. Since they’re small, there is no much to write and is sane to keep it under 50 or less.

Others, may have more than 50, even hundreds of routes. Instead of keep writing them inside a single file, you can organize your routes using multiple files. These are my top recommendations to deal with a slim and organized routes files so you don’t lose track of what and where.

Just add another file

Go to your and find the method. Here the Service Provider will map your Routes. A quick glance on the file and you will note that API and Web routes are mapped using other methods.

You can just simply copy-paste the code inside and change the group file for the one you want:

/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/my-custom-routes.php'));
}

The application will map the API routes, the Web routes, and finally your own custom routes.

Group a file

The Routes facade allows you to create a group of routes by using a Closure that returns more routes, but, as you saw earlier, the framework starts by calling a file.

In your routes files you can use the same technique. Instead of using a Closure, you can simply point to another file, effectively slimming down the route file.

Route::name('dashboard')
->prefix('dashboard')
->namespace('Dashboard')
->middleware(['auth','verified'])
->group(__DIR__ . '/web/dashboard.php');

Then, we can create a file containing the routes for our Dashboard. We also apply a custom namespace, prefix, middleware for all routes and a name to be appended.

We can also nest more groups inside a group, and have multiple on one file. No problem:

// routes/web/dashboard.phpRoute::get('/', 'HomeController');
Route::get('/account', 'AccountController@show');
Route::post('/account', 'AccountController@update');
Route::name('users')
->prefix('users')
->namespace('Users')
->middleware('can:manage-users')
->group(__DIR__ . '/dashboard/users.php');
Route::name('delivery')
->prefix('delivery')
->namespace('Delivery')
->middleware('can:manage-delivery')
->group(__DIR__ . 'dashboard/delivery.php');

A simple group

Sometimes it’s not necessary to put names, prefixes, namespaces and middlewares to a group. You can simply create a group, and put all routes inside, and manage their prefixes, namespaces, middlewares and names by a case-by-case scenario. I will just spit something random just to make an example:

// routes/web.phpRoute::group(__DIR__ . '/web/message.php');// routes/web/message.phpRoute::get('client/send', 'MessageController@clientShow');
Route::post('client/send', 'MessageController@clientSend');
Route::get('courier/send', 'MessageController@courierShow')
->middleware('can:send-message-to-courier');
Route::get('courier/send', 'MessageController@courierShow')
->middleware('can:send-message-to-courier');

Route Model Binding as prefix

Another thing you can do is to create groups is use Route Model Binding as a prefix, making all your child routes share the same binding.

// routes/web.phpRoute::prefix('{delivery}')->group(__DIR__ . '/web/delivery.php');// routes/web/delivery.phpRoute::get('/', 'DeliveryController@show');
Route::get('/routes', 'DeliveryController@routes');
Route::get('/products', 'DeliveryController@products');
Route::get('/drivers', 'DriverController@deliveryDriver');

So there is no need to change literally puke walls of Routes into one file and hoping for the best while you need a map to figure out where the hell is that named route that is colliding with other. /rant

Graphic Designer graduate. Full Stack Web Developer. Retired Tech & Gaming Editor.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store