首頁 php框架 Laravel Laravel 是基於 Module 實作 API 架構

Laravel 是基於 Module 實作 API 架構

May 23, 2020 am 10:03 AM
laravel

Laravel 是基於 Module 實作 API 架構

我非常喜歡寫基於模組化設計的軟體和程式設計方式,但我不太喜歡依賴第三方軟體包和類別庫來處理一些瑣碎的事情,因為它們不會讓你的程式水平得到很好的提升。所以這兩年來,我一直在用 Laravel 編寫基於模組的軟體,現在我對這個結果非常滿意。

推動我走向基於模組化設計的軟體和程式設計方式的決定性因素是我想持續提升我的程式設計水平。想像一下,你建構了一個專案結構,6 個月後你發現這個專案有許多 bug。在不影響 6 個月現有程式碼的情況下,通常不會輕易改變專案架構。在分析這個專案時,我注意到了兩個要點:你要么在整個專案中都有一個標準,要么堅持下去,要么模組化並逐個模組地改進。

有些人傾向於不惜一切代價、固守標準地開發,即使這可能意味著要堅持一個你不再喜歡的標準。就我個人來言,我更喜歡持續地改進,若是第 20 個模組和第 1 個模組寫得完全不一樣也沒關係。如果某天我需要回到模組 1 修復 BUG 或重構,我可以將其改進為第 20 個模組使用的最新標準。

假設,你也像我一樣喜歡基於模組化開發 Laravel 應用、盡可能避免在專案中添加不必要的第三方依賴 —— 本文是我的一點經驗。

1- 路由服務提供者

Laravel 路由系統可以說是整個應用程式的入口。首先需要修改的是預設的 RouteServiceProvider.php 文件,它應該將現有路由模組化。

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
    /**
     * 定义应用路由。
     *
     * @return void
     */
    public function map()
    {
        $this->mapModulesRoutes();
    }
    protected function mapModulesRoutes()
    {
        // 如果你在编写传统 Web 应用而非 HTTP API,请使用 `web` 中间件。 
        Route::middleware(&#39;api&#39;)
             ->group(base_path(&#39;routes/modules.php&#39;));
    }
}
登入後複製

如上,我們可以直接擺脫該檔案的整個樣板,只需設定一個模組化的路由檔案。

2- 模組檔案

Laravel 在 routes 資料夾中自帶了一些檔案。由於我們已經不在 RouteServiceProvider 中對應這些路由,所以可以直接刪除它們。接下來,我們建立一個 modules.php 路由檔案。

<?php
use Illuminate\Support\Facades\Route;
Route::group([], base_path(&#39;app/Modules/Books/routes.php&#39;));
Route::group([], base_path(&#39;app/Modules/Authors/routes.php&#39;));
登入後複製

3- Books 模組

在 app 資料夾中,建立 Modules/Books/routes.php 檔案。在此文件中,我們可以定義該應用 Books 模組的路由規則。

<?php
use App\Modules\Books\ListBooks;
use Illuminate\Support\Facades\Route;
Route::get(&#39;/books&#39;, ListBooks::class);
登入後複製

你可以使用基於控制器 —— 也就是 Laravel 中預設標準的路由方式,但我個人更喜歡 Good bye controllers, hello Request Handlers(放棄控制器,採用請求處理器) 的方式。如下是 ListBooks 的實作。

<?php
namespace App\Modules\Books;
use App\Eloquent\Book;
use App\Modules\Books\Resources\BookResource;
class ListBooks
{
    public function __invoke(Book $book)
    {
        return BookResource::collection($book->paginate());
    }
}
登入後複製

以上程式碼中 BookResource 是 Laravel 的資源轉換層。按照官方對於命名空間的建議,我們可以在 app/Modules/Books/Resources 資料夾中建立它。

<?php
namespace App\Modules\Books\Resources;
use Illuminate\Http\Resources\Json\Resource;
class BookResource extends Resource
{
    public function toArray($request)
    {
        return [
            &#39;id&#39; => $this->resource->id,
            &#39;title&#39; => $this->resource->title,
        ];
    }
}
登入後複製

4- Authors 模組

我們也可以透過 Routes 檔案來啟動 Authors 模組。

<?php
use App\Modules\Authors\ListAuthors;
use Illuminate\Support\Facades\Route;
Route::get(&#39;/authors&#39;, ListAuthors::class);
登入後複製

注意:  app/Modules/Authors 這個命名空間正表示我們所寫的文件,對於請求處理程序來說也是非常簡單的。

<?php
namespace App\Modules\Authors;
use App\Eloquent\Author;
use App\Modules\Authors\Resources\AuthorResource;
class ListAuthors
{
    public function __invoke(Author $author)
    {
        return AuthorResource::collection($author->paginate());
    }
}
登入後複製

最後,我們將編寫的 Resource 類別轉變為響應式的 JSON 格式。

<?php
namespace App\Modules\Authors\Resources;
use App\Modules\Books\Resources\BookResource;
use Illuminate\Http\Resources\Json\Resource;
class AuthorResource extends Resource
{
    public function toArray($request)
    {
        return [
            &#39;id&#39; => $this->resource->id,
            &#39;name&#39; => $this->resource->name,
            &#39;books&#39; => $this->whenLoaded(&#39;books&#39;, function () {
                return BookResource::collection($this->resource->books);
            })
        ];
    }
}
登入後複製

注意資源是如何進入另一個模組以重複使用 BookResource 。這通常不是一個比較好的選擇,因為模組應該是完全自給自足的,並且只能重複使用標準類,例如 Eloquent Models 或設計用於在任何模組上通用的通用的組件。這個問題的解決方案通常是將 BookResource 複製到 Authors 模組中,因此可以在不使用另一個模組的情況下進行更改,反之亦然。我決定保留這個跨模組的用法,這個例子表現出一個很好的經驗方法,就是讓模組之間彼此隔離,但是如果你認為上面的例子很簡單並且不太可能帶來任何問題。始終確保編寫測試以涵蓋您編寫的功能,以避免其他人在不知不覺中修改您的應用程式。

5- 結語

雖然這是一個非常簡單的例子,但我希望它能夠讓人們根據自己的需求來輕鬆操作使用Laravel 框架的結構標準。您可以非常輕鬆地更改檔案的位置,以便建立基於模組化的應用程式。我的大多數專案都附帶了App / Components 模組,可以適用於任何模組可重用的泛類型的基礎類別; App / Eloquent ,Modules 資料夾可以用於保存Eloquent 模型和資料庫關係模型,我們可以在其中構建任何基於模組化的功能。這是我最近開始研究的應用程式的資料夾目錄結構:

Laravel 是基於 Module 實作 API 架構

我希望每個人都能從中得到這個概念,每個模組都有自己的需求,並且可以擁有自己的資料夾 / 實體 / 類別 / 方法 / 屬性。沒有必要將所有模組標準化完全相同,因為某些模組比其他模組簡單得多,並且不需要大量的結構設計。此範例顯示 AccountChurn 模組透過 HTTP 資料夾提供 API,同時仍透過控制台提供 Artisan 指令。另一方面,AccountOverview 則僅提供 HTTP API,並且依賴倉庫、值物件(bags)以及服務類別(paginators)來提供更大的資料價值。

推薦教學:《PHP教學》《Laravel教學

以上是Laravel 是基於 Module 實作 API 架構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

在Laravel6項目中如何有效檢查Redis連接的有效性? 在Laravel6項目中如何有效檢查Redis連接的有效性? Apr 01, 2025 pm 02:00 PM

在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Apr 01, 2025 pm 12:21 PM

Laravel數據庫遷移過程中出現類重複定義問題在使用Laravel框架進行數據庫遷移時,開發者可能會遇到“類已使用�...

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

See all articles