Maison  >  Article  >  cadre php  >  Comment organiser votre routage dans un grand projet Laravel

Comment organiser votre routage dans un grand projet Laravel

Guanhui
Guanhuiavant
2020-05-07 10:13:462430parcourir

Imaginez un projet Laravel avec plus de 100 routes, y compris des modules séparés pour l'invité, l'utilisateur, l'administrateur, etc. Voulez-vous vraiment tout écrire dans un seul fichier ? Alors comment les regrouper et ajouter un préfixe à l’URL ? Voyez quelles méthodes sont disponibles

1. Routage WEB et API séparé

C'est simple, car Laravel l'a déjà fait pour vous. Il y a les deux fichiers suivants :

routes/web.php

routes/api.php

Par conséquent, si votre projet a à la fois des pages frontales et une API (le plus de scénarios d'utilisation (Laiyueguang), veuillez mettre le routage API dans api.php.

Par exemple, si vous avez la page /users et le point de terminaison /api/users/, écrivez-les dans leurs propres fichiers de routage pour éviter toute confusion causée par l'apparition du même nom dans le même fichier.

Mais j'ai récemment vu un contre-exemple du projet officiel Laravel. Dans Laravel Horizon, Taylor n'a que le routage API, mais il ne l'a pas écrit séparément. Il l'a quand même écrit dans routes/web.php :

Comment organiser votre routage dans un grand projet Laravel

Un autre exemple prouve que Laravel est. toujours très personnel, même Taylor lui-même n'a pas suivi les normes à 100 %.

2. Regroupez le fichier routes/web.php dans une structure structurée

L'exemple suivant est également issu de la documentation officielle de Laravel :

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

Le plus basique L'utilisation consiste à inclure différents groupes de routage dans différents middleware. Par exemple, vous souhaitez qu'un groupe soit restreint par le middleware d'authentification par défaut, un autre groupe soit restreint par un middleware personnalisé d'administrateur distinct, etc.

De cette façon, vous pouvez également utiliser des méthodes de regroupement d'itinéraires telles que le nom et le préfixe. Encore une fois, l'exemple est donné dans la documentation officielle :

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');
});

De plus, si vous souhaitez ajouter tous les middleware + nom + préfixe à un groupe, c'est plus facile à comprendre en les mettant dans un tableau :

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

Nous avons combiné cela dans un exemple concret avec trois groupes de routes :

Le groupe "invité" avec l'URL /front/XXXXX et aucun middleware

Avec / le groupe "Utilisateurs" avec user/XXXXX URL et middleware d'authentification

Groupe "Administrateur" avec /admin/XXXXX URL et middleware d'administration personnalisé

Voici comment tout regrouper Une façon de procéder dans le fichier routes/web.php :

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. Regroupez les contrôleurs à l'aide d'espaces de noms

Dans l'exemple ci-dessus, nous n'utilisons pas de contrôleur, nous avons simplement renvoyé du texte statique à titre d'exemple. Ajoutons un contrôleur et faisons preuve d'un peu de fantaisie - nous les structurerons en dossiers dans leurs propres espaces de noms différents, comme ceci :

Comment organiser votre routage dans un grand projet Laravel

Ensuite, nous pourrons les utiliser dans les fichiers de routage :

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

Mais et si dans ce groupe nous avions beaucoup de contrôleurs ? Devrions-nous continuer à ajouter Front.omeController ? Bien sûr que non. Vous pouvez également transmettre un espace de noms comme l'un des paramètres.

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. Groupe groupe imbriqué

La situation ci-dessus est divisée en 3 groupes. En fait, cela est simplifié. La structure du projet réel est légèrement différente. – il y a deux groupes : front et auth. Ensuite, dans auth, il y a deux sous-groupes : user et admin. Pour ce faire, nous pouvons créer des sous-groupes dans routes/web.php et attribuer différents middlewares/préfixes, 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');
    });
});

Nous pouvons même avoir plusieurs niveaux d'imbrication, ce qui est un exemple de projet open source. 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');
        // ...

Un autre exemple vient d'un autre CRM Laravel populaire appelé 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 Paramètres globaux dans RouteServiceProvider

Il existe un fichier qui. sert tous les paramètres de route – app/Providers/RouteServiceProvider.php. Il a une méthode map() qui lie deux fichiers de route – web et 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'));
    }

Avez-vous remarqué cela dans la méthode Et le middleware, l'espace de noms et le préfixe ? C'est ici que vous pouvez définir des configurations globales pour l'ensemble du fichier, afin de ne pas avoir à répéter ces paramètres pour chaque groupe de routage du fichier.

Il est principalement utilisé pour les routes API car leurs paramètres sont généralement les mêmes que ceux indiqués ci-dessous :

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

La méthode ci-dessus préfixera toutes les URL d'API avec api/v1/ au début.

6. Regrouper en plusieurs fichiers – est-ce que ça vaut le coup ?

Si vous disposez d'un grand nombre de routes et souhaitez les regrouper dans des fichiers séparés, vous pouvez utiliser le même fichier mentionné dans la section précédente – app/Providers/RouteServiceProvider.php. Si vous regardez attentivement sa méthode map(), vous verrez la position du commentaire à la fin :

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

Vous pouvez interpréter cela comme une "invitation" à ajouter plus de fichiers si vous le souhaitez. Vous pouvez donc créer une autre méthode dans ce fichier comme mapAdminRoutes() puis l'ajouter à la méthode map() et votre fichier sera automatiquement enregistré et chargé.

Personnellement, cependant, je ne vois aucun avantage à cette approche, et je ne la vois pas faire très souvent. Cela entraînerait une plus grande séparation des routages, mais parfois vous pouvez vous perdre dans ces fichiers et ne pas savoir où chercher un itinéraire spécifique.

7. Recherchez un itinéraire spécifique à l'aide de la commande Artisan route:list

En parlant d'itinéraires plus larges et de vous y perdre, nous avons une commande Artisan qui peut aider à localiser un certain itinéraire. .

Vous savez probablement que php artisan route:list affichera toutes les routes de votre projet

Comment organiser votre routage dans un grand projet Laravel

Mais vous savez qu'il existe davantage de fonctionnalités de filtrage pour trouver ce que vous Tu veux quelque chose ? Ajoutez simplement –method, ou –name, ou –path avec des arguments.

Filtrer par méthode – GET, POST etc :

Comment organiser votre routage dans un grand projet Laravel

Filtrer par nom ou partie d'URL :

Comment organiser votre routage dans un grand projet Laravel

Tutoriel recommandé : "Laravel"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer