首頁 > 後端開發 > php教程 > 適用於 5 人的 Laravel 最佳實踐、提示和技巧

適用於 5 人的 Laravel 最佳實踐、提示和技巧

Linda Hamilton
發布: 2024-10-30 00:17:29
原創
711 人瀏覽過

Laravel Best Practices, Tips, and Tricks for 5

隨著 2025 年的臨近,Laravel 仍然是 Web 開發的首選,為開發人員提供創建強大而高效的應用程式的工具。本文概述了關鍵的最佳實踐、提示和技巧,無論您使用的是 Laravel 9、10 還是 11,它們都可以提高程式碼品質並簡化工作流程。這些見解將幫助您充分利用 Laravel 並提高您的開發技能,無論您是初學者還是經驗豐富的開發人員。

保持 Laravel 和軟體包更新

保持 Laravel 更新有幾個主要好處:

  • 提高安全性:定期發布包括保護您的應用程式的重要安全修復。
  • 更好的效能:更新通常會增強效能,從而加快載入時間並提高程式碼效率。
  • 新特性與功能:保持最新狀態,利用新功能增強開發體驗。
  • 相容性:確保與最新的官方和社群包更好的相容性。

定期執行 Composer 更新對於保持套件更新至關重要。這個簡單的做法是確保您的軟體包具有最新功能和安全性修補程式的最佳方法之一。

如果您對更新猶豫不決,可能表示您的程式碼沒有經過充分的測試。透過採用測試實踐,您可以確保主要更新不會破壞您的程式碼,從而使您能夠充分利用 Laravel 的改進。

如果您不想手動更新,可以考慮使用 ServBay,這是一個環境管理工具,它已經整合了 PHP 8.4 beta 版本,可以更輕鬆地保持 Laravel 和各種軟體包的更新。

透過保持強有力的測試來防止嚴重錯誤

自動化測試是一個廣泛但經常被低估的領域。然而,它是確保專案可靠性的最重要的最佳實踐之一。

維護強大的測試套件的主要好處包括:

  • 更少的錯誤:定期測試有助於及早發現問題,從而形成更穩定的程式碼庫。
  • 更滿意的客戶:可靠的軟體會讓使用者滿意,他們可以信任您的產品。
  • 滿意的雇主:經過充分測試的專案體現了專業和對品質的承諾。
  • 自信的開發人員:透過全面的測試套件,您可以進行更改,而不必擔心引入新的錯誤。休息後返回項目變得不再那麼令人畏懼。

修改程式碼時,只需執行 php artisan test 即可識別任何損壞的功能,修復問題,然後重複該過程!

自動化測試可以顯著增強專案穩定性,大大提升您的職業生涯。

為了幫助您入門,Laracasts 提供免費測驗課程。您可以了解 PHPUnit(業界標準)和 Pest(簡化 PHP 測試的現代測試框架)。強烈推薦《Pest From Scratch》課程。

遵循預設目錄組織

你有沒有想過為什麼要用像 Laravel 這樣的框架?

框架提供了結構化的開發方法,確保所有團隊成員保持一致並朝著共同的目標努力。它們具有豐富、複雜、經過實戰考驗的功能,讓您能夠專注於專案的獨特方面,而不會陷入細節的困境。

那麼,遵循 Laravel 的預設專案結構是否被認為是最佳實務?絕對地!原因如下:

  • 方便:Laravel 的約定和結構都有詳細記錄。當您幾週或幾個月後返回專案時,您會欣賞預設設定的清晰度和熟悉度。
  • 團隊協作:與團隊成員合作時,每個人都了解 Laravel 的約定,使協作變得更加容易。利用這些共享知識可以推動專案向前發展,而不是每次都重新發明輪子。

使用自訂表單請求進行複雜驗證

Laravel 中的自訂表單請求是處理驗證的強大工具,提供了幾個關鍵優勢:

  • 重複使用驗證邏輯:跨多個控制器輕鬆重複使用驗證規則,保持程式碼乾燥(不要重複)。
  • 減少控制器膨脹:將驗證程式碼卸載到專用的表單請求類,保持控制器乾淨並專注於業務邏輯。

建立自訂表單請求

建立自訂表單請求很簡單。只需執行以下 Artisan 命令:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

然後,在您的控制器中,您可以簡單地鍵入提示請求:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

增強自訂表單請求

自訂表單要求還可以包含驗證以外的其他邏輯。例如,您可以透過重寫prepareForValidation方法在輸入資料到達控制器之前對其進行標準化:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

在此範例中,該方法在驗證過程發生之前會自動從標題產生一個 slug。

授權管理

自訂表單要求也可以處理授權邏輯。如果您發現使用政策很麻煩,您可以直接在表單要求中包含簡單的授權檢查。

使用單一操作控制器簡化您的程式碼庫

即使遵循最佳實踐,控制器也可能變得笨拙。一個很好的解決方案是在 Laravel 中使用單動作控制器。這些控制器旨在處理單一操作,而不是像標準資源控制器那樣處理多個操作。

建立單一動作控制器

要建立單一動作控制器,請使用以下 Artisan 指令:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

此指令建立一個只有一個操作的控制器,名稱為 __invoke。有關 __invoke 魔術方法的更多信息,請參閱 Laravel 文件。

定義路線

使用單一操作控制器,您可以簡化路由定義。以下是如何在您的路線中使用它:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

主觀最佳實踐

使用單一動作控制器是一種主觀的最佳實踐。由您和您的團隊決定此方法是否適合專案的結構和可讀性偏好。

使用中介軟體避免程式碼重複

在 Laravel 中,中間件是一個強大的工具,可讓您過濾或修改傳入的請求。透過利用中間件,您可以避免程式碼重複並保持控制器乾淨且易於管理。以下是一些常見的中間件用例:

  • 檢查所需權限:確保使用者擁有存取某些路由所需的權限。
  • 設定使用者區域設定:檢查使用者的首選語言並相應調整應用程式的區域設定。

Laravel 為常見任務提供了各種內建中間件,例如身份驗證和速率限制。

建立自訂中間件

要建立自訂中間件,請使用以下 Artisan 指令:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

在您的中間件中,您可以定義處理請求的邏輯。這是一個檢查使用者是否有足夠令牌的中間件範例:

php artisan make:controller ShowPostController --invokable
登入後複製
登入後複製

將中介軟體附加到路由

定義中間件後,您可以將其附加到任意數量的路由。這種模組化方法有助於保持程式碼整潔並減少控制器中的重複。

use App\Http\Controllers\ShowPostController;

// Single action controller route
Route::get('/posts/{post}', ShowPostController::class);
登入後複製
登入後複製

使用策略進行授權

在 Laravel 中利用授權策略對於建立清晰且可維護的應用程式至關重要。使用策略的三個主要好處是:

  • 跨控制器共用授權邏輯:透過將授權規則合併到策略中,您可以提高一致性並消除應用程式中的重複程式碼。
  • 降低控制器複雜性:將授權邏輯移至策略使控制器能夠專注於其主要任務,從而產生更清晰、更易於理解的程式碼。
  • 簡化授權碼存取:政策位於app/Policies目錄下,方便開發者在需要時輕鬆尋找和修改授權規則。

讓我們來看看使用貼文更新策略的實際場景:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

確保遷移是最新的

遷移是一種使用純 PHP 程式碼定義資料庫架構的方法。您可以將它們視為 phpMyAdmin 的程式碼替代方案,提供一種程式設計方式來管理資料庫結構。這種方法對團隊特別有利,因為它允許每個人在本地電腦上複製相同的開發環境,並在 Git 中維護清晰的更改歷史記錄。

遷移也有助於將專案部署到新環境(例如暫存或生產),而無需從其他環境匯出資料庫。然而,一個常見的陷阱是一些開發人員直接對資料庫進行更改,而不是創建新的遷移。這種做法可能會給其他團隊成員帶來不便,他們可能需要透過 Slack 請求資料庫轉儲。為了提升專案並保持一致性,有效利用遷移非常重要。

使用匿名遷移來防止衝突(Laravel 8 及更高版本)

匿名遷移是避免類別名稱衝突的有效解決方案。透過此功能,您可以建立多個名為「update_posts_table」的遷移而不會遇到錯誤,從而減少開發過程中的摩擦。

在 Laravel 9 及更高版本中,當您執行以下命令時,會自動產生匿名遷移:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

這些遷移的結構如下:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

有趣的是,您也可以在 Laravel 8 實現匿名遷移。為此,只需將類別名稱替換為 return new class 並確保在末尾包含分號即可。這樣,即使在早期版本中,您也可以享受匿名遷移的好處。

正確實作 down() 方法進行回滾

php artisan migrate:rollback 指令使用 down() 方法來撤銷對資料庫所做的變更。當一些開發人員選擇實現它而其他開發人員不這樣做時,重要的是要確保在使用它時正確定義您的 down() 方法。

本質上,down() 方法應該反轉 up() 方法中執行的操作。這是一個基本範例:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

如果您不想使用 down() 方法,只需刪除它即可。

遵循 Eloquent 的資料庫表命名約定

遵守 Laravel 的表命名約定是一種簡單的最佳實踐,可以使您的團隊受益匪淺。當您使用 Artisan 指令時,框架會自動處理這些約定,例如 php artisan make:model Post --migration --factory。

如果由於某種原因,您無法使用這些命令,這裡有一個快速指南:

  • 對於名為Post的模型,對應的表應命名為posts,使用複數形式。例如:

    • 評論模型→評論表
    • 回覆模型→回覆表
  • 對於連接貼文和評論的資料透視表(例如,comment_post):

    • 使用兩個名字的單數形式。
    • 按字母順序排列。

更多詳情請參考官方文件。

使用預先載入避免 N 1 問題

還有更多最佳實務需要介紹!你有遇過N 1 問題嗎?預先載入是防止它們的有效方法。

例如,如果您顯示30 個帖子及其作者的列表,由於延遲加載,Eloquent 將為這30 個帖子執行一個查詢,然後為每個作者執行額外的30 個查詢(這意味著每次您呼叫$post ->程式碼中的用戶,它檢索用戶關係)。

解決方案很簡單:使用with()方法將查詢次數從31個減少到2個。

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

為了防止 N 1 問題,您可以將應用程式設定為在延遲載入關係時拋出例外狀況。此限制僅應在本地環境中強制執行。

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

使用 Eloquent 的嚴格模式避免效能問題和錯誤

Eloquent 的嚴格模式是一個很有價值的除錯工具。它透過在各種場景下拋出異常來幫助開發人員識別開發過程中的潛在問題:

  • 延遲載入關係:延遲載入可能會導致效能問題,尤其是在處理大型資料集時。當相關模型僅在存取時才從資料庫中取得時,就會發生這種情況。在嚴格模式下,如果關係是延遲加載的,則會拋出異常,鼓勵使用急切加載。
  • 分配不可填入的屬性:Eloquent 模型中的 $fillable 屬性可以防止批次分配漏洞。如果您嘗試指派不可填充的屬性,則會觸發異常,確保開發人員在處理批次分配時保持謹慎。
  • 存取不存在的屬性:嘗試存取不存在或尚未從資料庫檢索的屬性可能會導致不可預測的行為或錯誤。嚴格模式會在這種情況下拋出異常,幫助開發者定位並解決這些問題。

要啟用嚴格模式,請將以下程式碼加入 AppServiceProvider.php 的 boot() 方法:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

使用新方法定義存取器和修改器

Laravel 9 引入了一種聲明存取器和修改器的新方法。現在介紹如何實作它們:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

這種新語法可讓您以更簡潔的方式定義存取器和修改器。您也可以快取計算成本較高的值:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

相較之下,之前的方法看起來像這樣:

php artisan make:controller ShowPostController --invokable
登入後複製
登入後複製

切換到新語法簡化了程式碼並增強了可讀性。

使用dispatchAfterResponse()處理長時間運行的任務

在處理耗時的任務時(例如提交聯絡表單後發送電子郵件),您可以透過將任務延遲到伺服器回應使用者之後來改善使用者體驗。這就是dispatchAfterResponse()發揮作用的地方,它允許您推遲長時間運行的進程:

use App\Http\Controllers\ShowPostController;

// Single action controller route
Route::get('/posts/{post}', ShowPostController::class);
登入後複製
登入後複製

或者,如果您喜歡使用匿名函數來安排任務,您可以這樣做:

php artisan make:middleware CheckTokens
登入後複製

透過使用dispatchAfterResponse(),您可以確保使用者從伺服器收到更快的回應,同時後台任務不會影響使用者體驗。

使用佇列處理長時間運行的任務

在處理計算密集型任務(例如處理使用者上傳的映像)時,立即執行這些操作可能會使伺服器過載並導致糟糕的使用者體驗。解決方法如下:

  • 伺服器壓力:為每個使用者提交即時處理任務可能會使伺服器不堪負荷。
  • 使用者體驗:使用者被迫等待,盯著載入畫面,導致沮喪。

Laravel 的佇列系統可讓您推遲這些長時間運行的任務以有序或受控的並行方式運行,確保伺服器保持回應並且使用者不必等待。

為了方便任務管理,請考慮使用 Laravel Horizo​​n,它提供了一個用於有效監視和控制佇列任務的使用者介面。這樣,您可以在背景處理複雜的進程,同時保持流暢的效能。

每次測試之前延遲刷新資料庫

在本機環境中進行測試時,最好每次執行測試時都使用新的資料庫。 Laravel 提供了一種有效的方法來處理這個問題,即在每次測試之前延遲刷新資料庫。這可以使用測試類別中的 RefreshDatabase 特徵來完成。這可以確保每次執行測試時資料庫都處於乾淨狀態,從而消除剩餘資料引起的潛在問題。

使用刷新資料庫

在測試類別中使用 RefreshDatabase 特徵:

php artisan make:request StorePostRequest
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

優點

  • 一致性:確保每次測試運行時資料庫狀態一致,避免因狀態變化而導致測試失敗。
  • 隔離:每個測試獨立運行,互不干擾,增強測試的可靠性。

安全管理敏感資訊

管理敏感資訊時,確保安全至關重要。以下是一些最佳實踐:

使用環境變數

將敏感資訊(例如 API 金鑰和資料庫憑證)儲存在 .env 檔案中,而不是程式碼庫中。

使用 Laravel 的加密功能

對於需要加密的數據,請利用 Laravel 的加密功能:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製

定期更新金鑰

確保定期更新應用程式金鑰(APP_KEY)並在更新後重新加密資料。

結論

透過遵循這些最佳實踐、提示和技巧,您可以顯著提高 Laravel 應用程式的品質和安全性。這些方法不僅可以幫助您編寫更有效率的程式碼,還可以為您的用戶提供更好的體驗。繼續學習和應用這些實踐將幫助您在發展中取得更大的成功。

以上是適用於 5 人的 Laravel 最佳實踐、提示和技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板