How to organize your routing in a large Laravel project
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:
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 中间件 }); });
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'); });
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 () { // ... });
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'); });
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:
Then we can Use them in routing files:
Route::group([ 'name' => 'front.', 'prefix' => 'front' ], function () { Route::get('about-us', 'Front.boutController@index')->name('about'); });
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'); });
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'); }); });
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'); // ...
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'); });
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')); }
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'); }); }
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(); // }
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
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.:
Filter by name or URL part:
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



LaravelEloquent Model Retrieval: Easily obtaining database data EloquentORM provides a concise and easy-to-understand way to operate the database. This article will introduce various Eloquent model search techniques in detail to help you obtain data from the database efficiently. 1. Get all records. Use the all() method to get all records in the database table: useApp\Models\Post;$posts=Post::all(); This will return a collection. You can access data using foreach loop or other collection methods: foreach($postsas$post){echo$post->

The future of PHP will be achieved by adapting to new technology trends and introducing innovative features: 1) Adapting to cloud computing, containerization and microservice architectures, supporting Docker and Kubernetes; 2) introducing JIT compilers and enumeration types to improve performance and data processing efficiency; 3) Continuously optimize performance and promote best practices.

Efficiently process 7 million records and create interactive maps with geospatial technology. This article explores how to efficiently process over 7 million records using Laravel and MySQL and convert them into interactive map visualizations. Initial challenge project requirements: Extract valuable insights using 7 million records in MySQL database. Many people first consider programming languages, but ignore the database itself: Can it meet the needs? Is data migration or structural adjustment required? Can MySQL withstand such a large data load? Preliminary analysis: Key filters and properties need to be identified. After analysis, it was found that only a few attributes were related to the solution. We verified the feasibility of the filter and set some restrictions to optimize the search. Map search based on city

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP remains important in modern web development, especially in content management and e-commerce platforms. 1) PHP has a rich ecosystem and strong framework support, such as Laravel and Symfony. 2) Performance optimization can be achieved through OPcache and Nginx. 3) PHP8.0 introduces JIT compiler to improve performance. 4) Cloud-native applications are deployed through Docker and Kubernetes to improve flexibility and scalability.

How does Laravel play a role in backend logic? It simplifies and enhances backend development through routing systems, EloquentORM, authentication and authorization, event and listeners, and performance optimization. 1. The routing system allows the definition of URL structure and request processing logic. 2.EloquentORM simplifies database interaction. 3. The authentication and authorization system is convenient for user management. 4. The event and listener implement loosely coupled code structure. 5. Performance optimization improves application efficiency through caching and queueing.

The reasons why PHP is the preferred technology stack for many websites include its ease of use, strong community support, and widespread use. 1) Easy to learn and use, suitable for beginners. 2) Have a huge developer community and rich resources. 3) Widely used in WordPress, Drupal and other platforms. 4) Integrate tightly with web servers to simplify development deployment.
