Home PHP Framework Laravel How to organize your routing in a large Laravel project

How to organize your routing in a large Laravel project

May 07, 2020 am 10:13 AM
laravel php routing

Imagine a Laravel project with 100+ routes, including separate modules for Guest, User, Administrator, etc. Do you really want to write everything in one file? So how do you group them and add a prefix to the URL? Let’s see what methods are available

1. Separate WEB and API routing

This is simple, because Laravel has already done it for you. There are the following two files:

routes/web.php

routes/api.php

Therefore, if your project has both a front-end page and an API (the more the usage scenario (Laiyueguang), please put the API routing in api.php.

For example, if you have the /users page and the /api/users/ endpoint, write them in their own routing files to avoid confusion caused by the same name appearing in the same file.

But I recently saw a counterexample from the official Laravel project. In Laravel Horizon, Taylor only has API routing, but he did not write it separately. He still wrote it in routes/web.php:

How to organize your routing in a large Laravel project

Another example proves that Laravel is still very personal ation, even Taylor himself did not follow the standards 100%.

2. Group the routes/web.php file into a structured structure

The following example is also from Laravel’s official documentation:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });
    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});
Copy after login

The most basic The usage is to include different routing groups in different middleware. For example, you want one group to be restricted by the auth middleware by default, another group to be restricted by a separate admin custom middleware, etc.

In this way, you can also use route grouping methods such as name and prefix. Again, the example is given in the official documentation:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // 匹配 URL 「/admin/users」
    });
});
Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // 路由名为 「admin.users」...
    })->name('users');
});
Copy after login

Also, if you want to add all middleware name prefixes to a group, it's easier to understand by putting them in an array:

// 而不是这样做: 
Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () {
    // ...
});
// 可以使用数组
Route::group([
    'name' => 'admin.', 
    'prefix' => 'admin', 
    'middleware' => 'auth'
], function () {
    // ...
});
Copy after login

Let's combine this into a real example with three route groups:

The "guest" group with /front/XXXXX URL and no middleware

with /user/ "Users" group with XXXXX URL and auth middleware

"Administrator" group with /admin/XXXXX URL and custom admin middleware

Here's how to group everything into routes / A method in the web.php file:

Route::group([
    'name' => 'admin.',
    'prefix' => 'admin',
    'middleware' => 'admin'
], function () {
    // URL链接:/admin/users
    // 路由名称:admin.users
    Route::get('users', function () {
        return 'Admin: user list';
    })->name('users');
});
Route::group([
    'name' => 'user.',
    'prefix' => 'user',
    'middleware' => 'auth'
], function () {
    // URL链接:/user/profile
    // 路由名称:user.profile
    Route::get('profile', function () {
        return 'User profile';
    })->name('profile');
});
Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    // 这里没有中间件
    // URL链接:/front/about-us
    // 路由名称:front.about
    Route::get('about-us', function () {
        return 'About us page';
    })->name('about');
});
Copy after login

3. Group controllers using namespaces

In the above example, we are not using controls processor, just returned static text as an example. Let's add a controller and get a little fancy — we'll structure them into folders in their own different namespaces, like this:

How to organize your routing in a large Laravel project

Then we can Use them in routing files:

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {
    Route::get('about-us', 'Front.boutController@index')->name('about');
});
Copy after login

But what if in this group we have many controllers? Should we keep adding Front.omeController? of course not. You can also pass a namespace as one of the parameters.

Route::group([
    'name' => 'front.',
    'prefix' => 'front',
    'namespace' => 'Front',
], function () {
    Route::get('about-us', 'AboutController@index')->name('about');
    Route::get('contact', 'ContactController@index')->name('contact');
});
Copy after login

4. Group nested group

The above situation is divided into 3 groups. In fact, this is simplified. The structure of the actual project is slightly different. – are two groups: front and auth. Then within auth, there are two subgroups: user and admin. To do this, we can create subgroups in routes/web.php and assign different middlewares/prefixes etc.

Route::group([
    'middleware' => 'auth',
], function() {
    Route::group([
        'name' => 'admin.',
        'prefix' => 'admin',
        'middleware' => 'admin'
    ], function () {
        // URL: /admin/users
        // Route name: admin.users
        Route::get('users', 'UserController@index')->name('users');
    });
    Route::group([
        'name' => 'user.',
        'prefix' => 'user',
    ], function () {
        // URL: /user/profile
        // Route name: user.profile
        Route::get('profile', 'ProfileController@index')->name('profile');
    });
});
Copy after login

We can even have multiple levels of nesting, which is an example of an open source project. Akaunting:

Route::group(['middleware' => 'language'], function () {
    Route::group(['middleware' => 'auth'], function () {
        Route::group(['prefix' => 'uploads'], function () {
            Route::get('{id}', 'Common.ploads@get');
            Route::get('{id}/show', 'Common.ploads@show');
            Route::get('{id}/download', 'Common.ploads@download');
        });
        Route::group(['middleware' => 'permission:read-admin-panel'], function () {
            Route::group(['prefix' => 'wizard'], function () {
                Route::get('/', 'Wizard.ompanies@edit')->name('wizard.index');
        // ...
Copy after login

Another example comes from another popular Laravel CRM called Monica:

Route::middleware(['auth', 'verified', 'mfa'])->group(function () {
    Route::name('dashboard.')->group(function () {
        Route::get('/dashboard', 'DashboardController@index')->name('index');
        Route::get('/dashboard/calls', 'DashboardController@calls');
        Route::get('/dashboard/notes', 'DashboardController@notes');
        Route::get('/dashboard/debts', 'DashboardController@debts');
        Route::get('/dashboard/tasks', 'DashboardController@tasks');
        Route::post('/dashboard/setTab', 'DashboardController@setTab');
    });
Copy after login

5. Global Settings in RouteServiceProvider

There is a file that serves all routing settings – app/Providers/RouteServiceProvider.php. It has a map() method that binds two routing files – web and API:

    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
    }
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }
Copy after login

Did you notice that in the method And middleware, namespace and prefix? This is where you can set global configurations for the entire file, so you don't have to repeat these settings for every routing group in the file.

It is mainly used for API routing, as their settings are usually the same, as shown below:

protected function mapApiRoutes()
{
    Route::group([
        'middleware' => ['api'],
        'namespace' => $this->namespace,
        'prefix' => 'api/v1',
    ], function ($router) {
        require base_path('routes/api.php');
    });
}
Copy after login

The above method will prefix all API URLs with api/v1/ at the beginning.

6. Grouping into more files – is it worth it?

If you have a large number of routes and want to group them into separate files, then you can use the same file mentioned in the previous section – app/Providers/RouteServiceProvider.php. If you look closely at its map() method, you'll see the comment position at the end:

public function map()
{
    $this->mapApiRoutes();
    $this->mapWebRoutes();
    //
}
Copy after login

If you like, you can interpret this as an "invitation" to add more files. So you can create another method inside this file like mapAdminRoutes() and then add it to the map() method and your file will be automatically registered and loaded.

But, personally, I don't see any advantage to this approach, and I don't see it done very often. It would bring more routing separation, but sometimes you can get lost in those files and not sure where to look for a specific route.

7. Find a specific route using the Artisan route:list command

Speaking of larger routes and getting lost in there, we have an Artisan command that can help locate a certain route.

You probably know that php artisan route:list will display all the routes in your project

How to organize your routing in a large Laravel project

but you know there are more filtering capabilities to find what you want Want something? Just add –method, or –name, or –path with arguments.

Filter by method – GET, POST, etc.:

How to organize your routing in a large Laravel project

Filter by name or URL part:

How to organize your routing in a large Laravel project

Recommended tutorial: "Laravel"

The above is the detailed content of How to organize your routing in a large Laravel project. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1666
14
PHP Tutorial
1272
29
C# Tutorial
1252
24
The Continued Use of PHP: Reasons for Its Endurance The Continued Use of PHP: Reasons for Its Endurance Apr 19, 2025 am 12:23 AM

What’s still popular is the ease of use, flexibility and a strong ecosystem. 1) Ease of use and simple syntax make it the first choice for beginners. 2) Closely integrated with web development, excellent interaction with HTTP requests and database. 3) The huge ecosystem provides a wealth of tools and libraries. 4) Active community and open source nature adapts them to new needs and technology trends.

Laravel vs. Python (with Frameworks): A Comparative Analysis Laravel vs. Python (with Frameworks): A Comparative Analysis Apr 21, 2025 am 12:15 AM

Laravel is suitable for projects that teams are familiar with PHP and require rich features, while Python frameworks depend on project requirements. 1.Laravel provides elegant syntax and rich features, suitable for projects that require rapid development and flexibility. 2. Django is suitable for complex applications because of its "battery inclusion" concept. 3.Flask is suitable for fast prototypes and small projects, providing great flexibility.

The Compatibility of IIS and PHP: A Deep Dive The Compatibility of IIS and PHP: A Deep Dive Apr 22, 2025 am 12:01 AM

IIS and PHP are compatible and are implemented through FastCGI. 1.IIS forwards the .php file request to the FastCGI module through the configuration file. 2. The FastCGI module starts the PHP process to process requests to improve performance and stability. 3. In actual applications, you need to pay attention to configuration details, error debugging and performance optimization.

What happens if session_start() is called multiple times? What happens if session_start() is called multiple times? Apr 25, 2025 am 12:06 AM

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

Using Laravel: Streamlining Web Development with PHP Using Laravel: Streamlining Web Development with PHP Apr 19, 2025 am 12:18 AM

Laravel optimizes the web development process including: 1. Use the routing system to manage the URL structure; 2. Use the Blade template engine to simplify view development; 3. Handle time-consuming tasks through queues; 4. Use EloquentORM to simplify database operations; 5. Follow best practices to improve code quality and maintainability.

What database versions are compatible with the latest Laravel? What database versions are compatible with the latest Laravel? Apr 25, 2025 am 12:25 AM

The latest version of Laravel10 is compatible with MySQL 5.7 and above, PostgreSQL 9.6 and above, SQLite 3.8.8 and above, SQLServer 2017 and above. These versions are chosen because they support Laravel's ORM features, such as the JSON data type of MySQL5.7, which improves query and storage efficiency.

Composer: Aiding PHP Development Through AI Composer: Aiding PHP Development Through AI Apr 29, 2025 am 12:27 AM

AI can help optimize the use of Composer. Specific methods include: 1. Dependency management optimization: AI analyzes dependencies, recommends the best version combination, and reduces conflicts. 2. Automated code generation: AI generates composer.json files that conform to best practices. 3. Improve code quality: AI detects potential problems, provides optimization suggestions, and improves code quality. These methods are implemented through machine learning and natural language processing technologies to help developers improve efficiency and code quality.

What is the difference between php framework laravel and yii What is the difference between php framework laravel and yii Apr 30, 2025 pm 02:24 PM

The main differences between Laravel and Yii are design concepts, functional characteristics and usage scenarios. 1.Laravel focuses on the simplicity and pleasure of development, and provides rich functions such as EloquentORM and Artisan tools, suitable for rapid development and beginners. 2.Yii emphasizes performance and efficiency, is suitable for high-load applications, and provides efficient ActiveRecord and cache systems, but has a steep learning curve.

See all articles