您好,登錄后才能下訂單哦!
這篇文章主要為大家詳細(xì)介紹了Laravel項(xiàng)目中組織路由的方法,圖文詳解容易學(xué)習(xí),配合代碼閱讀理解效果更佳,感興趣的小伙伴們可以參考一下。
1. 分離 WEB 和 API 路由
這個(gè)簡(jiǎn)單,因?yàn)?Laravel 已經(jīng)幫你做了。有如下兩個(gè)文件:
routes/web.php
routes/api.php
因此,如果你的項(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 :
另一個(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)有中間件的「訪(fǎng)客」組
帶有 / user / XXXXX URL 和 auth 中間件的「用戶(hù)」組
帶有 / 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)造到各自不同的命名空間的文件夾中,如下所示:
然后我們可以在路由文件中使用它們:
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è)組:front 和 auth 。 然后在 auth 中,有兩個(gè)子組:user 和 admin 。為此, 我們可以在 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, namespace 和 prefix ? 這是您可以為整個(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)目中的所有路由
但您知道還有更多的過(guò)濾功能來(lái)找到您想要的東西嗎? 只需添加帶參數(shù)的 –method, 或 –name, 或 –path 。
通過(guò) method 過(guò)濾 – GET, POST 等:
按名稱(chēng)或 URL 部分過(guò)濾:
以上就是Laravel項(xiàng)目中組織路由的方法介紹,詳細(xì)使用情況還得要大家自己使用過(guò)才能知道具體要領(lǐng)。如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。