如何在大型 Laravel 專案中組織你的路由
想像一下一個擁有 100 多個路由的 Laravel 項目,其中包括訪客,用戶,管理員等分離的模組。你真的要將所有內容寫在一個文件中嗎?那麼如何將它們分組,並為 URL 添加前綴呢?看看有哪些辦法
1. 分離 WEB 和 API 路由
這個簡單,因為 Laravel 已經幫你做了。有以下兩個檔案:
routes/web.php
routes/api.php
因此,如果你的專案同時具有前端頁面和API (使用場景越來越廣),請把API 的路由放在api.php 裡。
例如,如果你有 /users 頁面,又有 /api/users/ 端點,把他們分別寫在自己屬於自己路由文件裡,以免在同一文件中出現同一相同名稱而產生混淆。
但我最近還是從 官方 Laravel 專案中看到了反例。在Laravel Horizon 中,Taylor 只有API 路由,但他沒有分開寫,還是寫在了routes/web.php :
另一個例子證明Laravel 還是非常的個人化,連Taylor 自己也沒有100% 依照標準來。
2. 把routes/web.php 檔案分組結構化
下面範例也是來自Laravel 官方文件的範例:
Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // 使用 first 和 second 中间件 }); Route::get('user/profile', function () { // 使用 first 和 second 中间件 }); });
最基本的用法是將不同的路由分組包含在不同的中間件裡面。例如,你希望一個群組預設受 auth 中間件限制,另一組受單獨的 admin 自訂中間件限制等。
這樣,你還可以使用 名稱 和 前綴 等路由分組方法。同樣,官方文件中給出了示例:
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'); });
另外,如果您要將所有中間件名稱前綴添加到一個組中,則將它們放入數組中更容易理解:
// 而不是这样做: Route::name('admin.')->prefix('admin')->middleware('admin')->group(function () { // ... }); // 可以使用数组 Route::group([ 'name' => 'admin.', 'prefix' => 'admin', 'middleware' => 'auth' ], function () { // ... });
我們將其結合為一個擁有三個路由分組的真實範例:
帶有/ front / XXXXX URL 且沒有中間件的「訪客」群組
帶有/ user / XXXXX URL 和auth 中間件的「使用者」群組
帶有/ admin / XXXXX URL 和自訂admin 中間件的「管理員」群組
以下是將所有內容分組到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. 使用命名空間對控制器進行分組
在上面的範例中,我們沒有使用控制器,只是返回了靜態文字作為範例。讓我們加入一個控制器,來點小花樣— 我們會將它們建構到各自不同的命名空間的資料夾中,如下所示:
Route::group([ 'name' => 'front.', 'prefix' => 'front' ], function () { Route::get('about-us', 'Front.boutController@index')->name('about'); });
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 個群組,實際上這是被簡化的, 實際專案的結構稍有不同– 是兩組:front 和auth 。然後在 auth 中,有兩個子群組:user 和 admin 。為此, 我們可以在 routes/web.php 中建立子組,並分配不同的中間件 / 前綴等。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'); }); });
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'); // ...
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 中的全域設定
#有一個服務所有路由設定的檔案– app/Providers/RouteServiceProvider.php. 它具有綁定兩個路由檔案– 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')); }
protected function mapApiRoutes() { Route::group([ 'middleware' => ['api'], 'namespace' => $this->namespace, 'prefix' => 'api/v1', ], function ($router) { require base_path('routes/api.php'); }); }
6. 分組成更多檔案 – 這值得嗎?
如果您有大量的路由,並且希望將它們分組到單獨的文件中,那麼您可以使用上一節中提到的相同文件 – app/Providers/RouteServiceProvider.php。如果您仔細查看它的 map() 方法,您將在末尾看到註釋位置:public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); // }
7. 使用 Artisan route:list 指令來尋找特定路由
說到更大的路由並迷失在那裡,我們有一個 Artisan 指令可以幫助定位某個路由。
您可能知道php artisan route:list 將展示專案中的所有路由
但您知道還有更多的過濾功能來找到您想要的東西嗎?只需新增帶有參數的 –method, 或 –name, 或 –path 。
透過method 過濾– GET, POST 等:
# 依名稱或URL 部分過濾:
推薦教學:《Laravel》
以上是如何在大型 Laravel 專案中組織你的路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

IIS和PHP可以兼容,通過FastCGI實現。 1.IIS通過配置文件將.php文件請求轉發給FastCGI模塊。 2.FastCGI模塊啟動PHP進程處理請求,提高性能和穩定性。 3.實際應用中需注意配置細節、錯誤調試和性能優化。

Laravel適合團隊熟悉PHP且需功能豐富的項目,Python框架則視項目需求而定。 1.Laravel提供優雅語法和豐富功能,適合需要快速開發和靈活性的項目。 2.Django適合複雜應用,因其“電池包含”理念。 3.Flask適用於快速原型和小型項目,提供極大靈活性。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

Laravel優化Web開發流程的方法包括:1.使用路由系統管理URL結構;2.利用Blade模板引擎簡化視圖開發;3.通過隊列處理耗時任務;4.使用EloquentORM簡化數據庫操作;5.遵循最佳實踐提高代碼質量和可維護性。

最新版本的Laravel10與MySQL5.7及以上、PostgreSQL9.6及以上、SQLite3.8.8及以上、SQLServer2017及以上兼容。這些版本選擇是因為它們支持Laravel的ORM功能,如MySQL5.7的JSON數據類型,提升了查詢和存儲效率。

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

Laravel和Yii的主要區別在於設計理念、功能特性和使用場景。 1.Laravel注重開發的簡潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開發和初學者。 2.Yii強調性能和效率,適用於高負載應用,提供高效的ActiveRecord和緩存系統,但學習曲線較陡。
