大型 Laravel 項(xiàng)目中如何組織你的路由

原文鏈接:https://learnku.com/laravel/t/38917

討論請(qǐng)前往專(zhuān)業(yè)的 Laravel 開(kāi)發(fā)者論壇:https://learnku.com/Laravel

想象一下一個(gè)擁有 100 多個(gè)路由的 Laravel 項(xiàng)目宪彩,其中包括訪客,用戶,管理員等分離的模塊面殖。你真的要將所有內(nèi)容寫(xiě)在在一個(gè)文件中嗎冯袍?那么如何將它們分組,并且為 URL 添加前綴呢?看看有哪些辦法麦萤。


1. 分離 WEB 和 API 路由

這個(gè)簡(jiǎn)單炼吴,因?yàn)?Laravel 已經(jīng)幫你做了本鸣。有如下兩個(gè)文件:

因此,如果你的項(xiàng)目同時(shí)具有前端頁(yè)面和 API (使用場(chǎng)景越來(lái)越廣)硅蹦,請(qǐng)把 API 的路由放在 api.php 里荣德。

例如,如果你有 /users 頁(yè)面童芹,又有 /api/users/ 端點(diǎn)涮瞻,把他們分別寫(xiě)在自己屬于自己路由文件里,以免在同一文件中出現(xiàn)同一相同名稱(chēng)而產(chǎn)生混淆假褪。

但我最近還是從 官方 Laravel 項(xiàng)目中看到了反例署咽。在 Laravel Horizon 中,Taylor 只有 API 路由生音,但他沒(méi)有分開(kāi)寫(xiě)宁否,還是寫(xiě)在了 routes/web.php :

image

另一個(gè)例子證明 Laravel 還是非常的個(gè)人化,甚至 Taylor 自己也沒(méi)有 100% 按照標(biāo)準(zhǔn)來(lái)久锥。


2. 把 routes/web.php 文件分組結(jié)構(gòu)化

下面例子也是來(lái)自 Laravel 官方文檔 的示例:

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

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

最基本的用法是將不同的路由分組包含在不同的中間件里面家淤。例如,你希望一個(gè)組默認(rèn)受 auth 中間件限制瑟由,另一組受單獨(dú)的 admin 自定義中間件限制等絮重。

這樣,你還可以使用 名稱(chēng)前綴 等路由分組方法歹苦。同樣青伤,官方文檔中給出了示例:

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

另外,如果您要將所有中間件 + 名稱(chēng) + 前綴添加到一個(gè)組中殴瘦,則將它們放入數(shù)組中更容易理解:

// 而不是這樣做: 
Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () {
    // ...
});

// 可以使用數(shù)組
Route::group([
    'name' => 'admin.', 
    'prefix' => 'admin', 
    'middleware' => 'auth'
], function () {
    // ...
});

我們將其結(jié)合為一個(gè)擁有三個(gè)路由分組的真實(shí)示例:

  • 帶有 / front / XXXXX URL 且沒(méi)有中間件的「訪客」組
  • 帶有 / user / XXXXX URL 和 auth 中間件的「用戶」組
  • 帶有 / admin / XXXXX URL 和自定義 admin 中間件的「管理員」組

以下是將所有內(nèi)容分組到 routes / web.php 文件中的一種方法:

Route::group([
    'name' => 'admin.',
    'prefix' => 'admin',
    'middleware' => 'admin'
], function () {

    // URL鏈接:/admin/users
    // 路由名稱(chēng):admin.users
    Route::get('users', function () {
        return 'Admin: user list';
    })->name('users');

});

Route::group([
    'name' => 'user.',
    'prefix' => 'user',
    'middleware' => 'auth'
], function () {

    // URL鏈接:/user/profile
    // 路由名稱(chēng):user.profile
    Route::get('profile', function () {
        return 'User profile';
    })->name('profile');

});

Route::group([
    'name' => 'front.',
    'prefix' => 'front'
], function () {

    // 這里沒(méi)有中間件
    // URL鏈接:/front/about-us
    // 路由名稱(chēng):front.about
    Route::get('about-us', function () {
        return 'About us page';
    })->name('about');

});

3. 使用命名空間對(duì)控制器進(jìn)行分組

在上面的例子中狠角,我們沒(méi)有使用控制器,只是返回了靜態(tài)文本作為示例蚪腋。 讓我們添加一個(gè)控制器丰歌,來(lái)點(diǎn)小花樣 — 我們會(huì)將它們構(gòu)造到各自不同的命名空間的文件夾中姨蟋,如下所示:

image

然后我們可以在路由文件中使用它們:

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

但是如果在這個(gè)組中我們有很多控制器呢? 我們應(yīng)該一直添加Front.omeController 嗎? 當(dāng)然不是立帖。您也可以將命名空間作為參數(shù)之一眼溶。

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. 組嵌套組

上面的情況,分為了3個(gè)組晓勇,實(shí)際上這是被簡(jiǎn)化的堂飞, 實(shí)際項(xiàng)目的結(jié)構(gòu)稍有不同 – 是 個(gè)組:frontauth 。 然后在 auth 中绑咱,有兩個(gè)子組:useradmin 绰筛。為此, 我們可以在 routes/web.php中創(chuàng)建子組描融,并分配不同的中間件/前綴等铝噩。

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

    });

});

我們甚至可以多層嵌套,這是開(kāi)源項(xiàng)目的一個(gè)示例稼稿。 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');

        // ...

另一個(gè)例子來(lái)自另一個(gè)流行的Laravel CRM薄榛,名為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. RouteServiceProvider 中的全局設(shè)置

有一個(gè)服務(wù)于所有路由設(shè)置的文件 – app/Providers/RouteServiceProvider.php. 它具有綁定兩個(gè)路由文件 – web 和 API 的 map() 方法:

    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 ? 這是您可以為整個(gè)文件設(shè)置全局配置的地方让歼,因此不必為文件中的每個(gè)路由組重復(fù)這些設(shè)置敞恋。

它主要用于 API 路由,因?yàn)樗鼈兊脑O(shè)置通常是相同的谋右,如下所示:

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

上述方法將在所有 API URLs 的開(kāi)頭加上 api/v1/ 前綴硬猫。


6. 分組成更多文件 – 這值得嗎?

如果您有大量的路由改执,并且希望將它們分組到單獨(dú)的文件中啸蜜,那么您可以使用上一節(jié)中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔細(xì)查看它的 map() 方法辈挂,您將在末尾看到注釋位置:

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

    $this->mapWebRoutes();

    //
}

如果愿意衬横,您可以將其解釋為添加更多文件的“邀請(qǐng)”。因此终蒂,您可以在此文件內(nèi)創(chuàng)建另一個(gè)方法蜂林,例如 mapAdminRoutes(),然后將其添加到 map() 方法拇泣, 您的文件將被自動(dòng)注冊(cè)并加載噪叙。

但是,就我個(gè)人而言霉翔,我看不出這種方法有什么優(yōu)勢(shì)睁蕾,而且我也沒(méi)有經(jīng)常看到這種做法。它會(huì)帶來(lái)更多的路由分離子眶,但有時(shí)您會(huì)迷失在那些文件中瀑凝,不確定在哪里查找特定的路由。


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

說(shuō)到更大的路由并迷失在那里壹店,我們有一個(gè) Artisan 命令可以幫助定位某個(gè)路由猜丹。

您可能知道 php artisan route:list 將展示項(xiàng)目中的所有路由

image

但您知道還有更多的過(guò)濾功能來(lái)找到您想要的東西嗎? 只需添加帶參數(shù)的 –method,–name,–path 硅卢。

通過(guò) method 過(guò)濾 – GET, POST 等:

image

按名稱(chēng)或 URL 部分過(guò)濾:

image

這就是我所能告訴的關(guān)于在大型項(xiàng)目中分組路由的全部?jī)?nèi)容。你還有其他例子嗎藏杖?請(qǐng)?jiān)谠u(píng)論中分享将塑。

原文鏈接:https://learnku.com/laravel/t/38917

討論請(qǐng)前往專(zhuān)業(yè)的 Laravel 開(kāi)發(fā)者論壇:https://learnku.com/Laravel

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝌麸,隨后出現(xiàn)的幾起案子点寥,更是在濱河造成了極大的恐慌,老刑警劉巖来吩,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敢辩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弟疆,警方通過(guò)查閱死者的電腦和手機(jī)戚长,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怠苔,“玉大人同廉,你說(shuō)我怎么就攤上這事「趟荆” “怎么了迫肖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攒驰。 經(jīng)常有香客問(wèn)我蟆湖,道長(zhǎng),這世上最難降的妖魔是什么玻粪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任隅津,我火速辦了婚禮,結(jié)果婚禮上奶段,老公的妹妹穿的比我還像新娘饥瓷。我一直安慰自己,他們只是感情好痹籍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布呢铆。 她就那樣靜靜地躺著,像睡著了一般蹲缠。 火紅的嫁衣襯著肌膚如雪棺克。 梳的紋絲不亂的頭發(fā)上悠垛,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音娜谊,去河邊找鬼确买。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纱皆,可吹牛的內(nèi)容都是我干的湾趾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼派草,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搀缠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起近迁,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艺普,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鉴竭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歧譬,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年搏存,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑰步。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祭埂,死狀恐怖面氓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛆橡,我是刑警寧澤舌界,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泰演,受9級(jí)特大地震影響呻拌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睦焕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一藐握、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垃喊,春花似錦猾普、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春溜在,著一層夾襖步出監(jiān)牢的瞬間陌知,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工掖肋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仆葡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓志笼,卻偏偏與公主長(zhǎng)得像沿盅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纫溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于創(chuàng)業(yè)皇耗,很早就想寫(xiě)這個(gè)話題,之前又看了入江之鯨寫(xiě)的一篇文章《上輩子造孽揍很,這輩子男友創(chuàng)業(yè)》郎楼,雖然是篇軟文,但卻說(shuō)出...
    Stone_blossom閱讀 4,199評(píng)論 1 2
  • 你喝了紅酒 然后又喝了一些黃酒 現(xiàn)在的你靠在我的肩上 頭發(fā)鋪滿衣領(lǐng)的縫隙 而在桌子的另一側(cè) 他們高聲地爭(zhēng)論著政治 ...
    托爾西奇閱讀 137評(píng)論 0 0
  • 文/寧?kù)o致遠(yuǎn) 終于提筆了,竟是筆尖顫抖简珠,呼吸粗重阶界,思緒凝滯!一個(gè)自認(rèn)筆鋒剛健的人聋庵,面對(duì)另一個(gè)朋友的拳拳真誠(chéng)...
    寧?kù)o致遠(yuǎn)05閱讀 161評(píng)論 1 6
  • 1膘融、感恩星期一,讓我又可以開(kāi)心的工作了祭玉,謝謝氧映!謝謝!謝謝脱货! 2岛都、感恩可愛(ài)的小米,讓我吃上了暖暖的小米粥振峻,謝謝臼疫!謝謝...
    兜是愛(ài)閱讀 133評(píng)論 0 1
  • 昨天在家整理書(shū)柜烫堤,翻出了幾本泛黃的筆記本,有兩本都已經(jīng)破得快要散架了。打開(kāi)來(lái)看塔逃,自己不禁啞然失笑讯壶,本子里記錄的全是...
    大雪漫天閱讀 365評(píng)論 0 1