Maison  >  Article  >  cadre php  >  Parlons de la façon d'organiser le routage dans les grands projets Laravel

Parlons de la façon d'organiser le routage dans les grands projets Laravel

青灯夜游
青灯夜游avant
2022-12-14 20:32:261632parcourir

Parlons de la façon d'organiser le routage dans les grands projets Laravel

Imaginez un projet Laravel avec plus de 100 routes comprenant 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 ? Découvrez quelles options 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 :

Donc, si votre projet comporte à la fois des pages frontales et une API (les scénarios d'utilisation sont de plus en plus larges et plus large), veuillez mettre les routes API dans api.php. [Recommandation associée : tutoriel vidéo laravel]

Par exemple, si vous avez une page /users et un point de terminaison /api/users/, écrivez-les séparément dans leurs propres fichiers de routage pour éviter d'être dans le même fichier. La confusion surgit en raison de la présence du même nom.

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

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


2. Regroupez et structurez le fichier routes/web.php

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

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

    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});

L'utilisation la plus basique est d'inclure différents groupes de routes dans différents middleware dans . Par exemple, vous souhaitez qu'un groupe soit restreint par le middleware auth par défaut, un autre groupe soit restreint par un middleware personnalisé admin distinct, etc.

De cette façon, vous pouvez également utiliser des méthodes de regroupement de routage telles que name et prefix. 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 le combinons A exemple concret avec trois groupes de routes :

  • Groupe "Invités" avec /front/XXXXX URL et aucun middleware
  • Avec /user/XXXXX URL et auth middleware groupe "Utilisateurs"
  • "Admin " groupe avec /admin/XXXXX
  • URL et middleware
admin

personnalisé

Voici un aperçu du regroupement de tout dans un fichier
routes/web.php

Méthode :
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. Groupe de contrôleurs utilisant espaces de noms

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

Ensuite, nous pourrons les utiliser dans nos fichiers de routes :

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

Mais que se passe-t-il si nous en avons plusieurs contrôleurs dans ce groupe ? 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 lui-même est légèrement différente – ​​​​il y a deux groupes : front. et auth. Ensuite, au sein de 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');

    });

});

On peut même avoir plusieurs niveaux d'imbrication, ceci est un exemple issu d'un 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 routage – app/Providers/RouteServiceProvider. .php

. Il possède la 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'));
    }

您是否注意到方法中提及的 middleware, namespaceprefix ? 这是您可以为整个文件设置全局配置的地方,因此不必为文件中的每个路由组重复这些设置。

它主要用于 API 路由,因为它们的设置通常是相同的,如下所示:

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

上述方法将在所有 API URLs 的开头加上 api/v1/ 前缀。


6. 分组成更多文件 – 这值得吗?

如果您有大量的路由,并且希望将它们分组到单独的文件中,那么您可以使用上一节中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔细查看它的 map() 方法,您将在末尾看到注释位置:

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

    $this->mapWebRoutes();

    //}

如果愿意,您可以将其解释为添加更多文件的“邀请”。因此,您可以在此文件内创建另一个方法,例如 mapAdminRoutes(),然后将其添加到 map() 方法, 您的文件将被自动注册并加载。

但是,就我个人而言,我看不出这种方法有什么优势,而且我也没有经常看到这种做法。它会带来更多的路由分离,但有时您会迷失在那些文件中,不确定在哪里查找特定的路由。


7. 使用 Artisan route:list 命令查找特定路由

说到更大的路由并迷失在那里,我们有一个 Artisan 命令可以帮助定位某个路由。

您可能知道 php artisan route:list 将展示项目中的所有路由

但您知道还有更多的过滤功能来找到您想要的东西吗? 只需添加带参数的 –method,–name,–path

通过 method 过滤 – GET, POST 等:

按名称或 URL 部分过滤:


这就是我所能告诉的关于在大型项目中分组路由的全部内容。你还有其他例子吗?请在评论中分享。

原文地址:https://laraveldaily.com/how-to-structure-routes-in-large-laravel-projects/

译文地址:https://learnku.com/laravel/t/38917

更多编程相关知识,请访问:编程视频!!

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