」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 DTO 簡化 Laravel 中的資料傳輸

使用 DTO 簡化 Laravel 中的資料傳輸

發佈於2024-11-07
瀏覽:440

Simplifying Data Transfer in Laravel with DTOs

這是如何使用 Laravel Data:

建立資料傳輸物件 (DTO) 的逐步範例

1. 安裝Laravel封包

首先,使用 Composer 安裝 spatie/laravel-data 套件。該軟體包有助於創建 DTO 並有效管理資料。

composer require spatie/laravel-data

2. 建立資料傳輸物件(DTO)

安裝套件後,我們可以建立一個DTO類別來處理資料傳輸。假設我們有一個 User 實體,我們想要建立一個 DTO 來傳輸使用者資料。

執行以下 Artisan 指令來產生新的 DTO 類別:

php artisan make:data UserData

這將在 App/Data 目錄中建立一個 UserData 類別。

3. 定義DTO中的屬性與型別

現在,讓我們編輯 UserData 類別來定義您期望的 DTO 屬性和資料類型。

namespace App\Data;

use Spatie\LaravelData\Data;

class UserData extends Data
{
    public function __construct(
        public string $name,
        public string $email,
        public string $address,
        public ?string $phone = null  // Optional phone field
    ) {}
}

解釋:

  • __construct 方法會自動將傳入值指派給 DTO 屬性。
  • ?string $phone = null 表示phone 屬性是可選的。

4. 在控制器中使用DTO

現在 UserData DTO 已創建,我們可以在控制器內使用它來處理傳入資料、轉換資料並在應用程式的各層之間傳遞資料。

namespace App\Http\Controllers;

use App\Data\UserData;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // Validate the incoming request data
        $validatedData = $request->validate([
            'name' => 'required|string',
            'email' => 'required|email',
            'address' => 'required|string',
            'phone' => 'nullable|string',
        ]);

        // Create a UserData DTO
        $userData = UserData::from($validatedData);

        // You can now access $userData->name, $userData->email, etc.
        User::create([
            'name' => $userData->name,
            'email' => $userData->email,
            'address' => $userData->address,
            'phone' => $userData->phone,
        ]);

        return response()->json(['message' => 'User created successfully']);
    }
}

解釋:

  • UserData::from() 方法會自動將經過驗證的請求資料對應到 DTO 物件中。
  • DTO 物件現在可用於在控制器和模型(或應用程式的其他層)之間傳輸資料。

5. 使用DTO轉換資料

您也可以在回傳回應時使用 DTO 來轉換資料。我們來修改UserController中的show方法,透過DTO傳回用戶資料。

public function show(User $user)
{
    // Convert the User model to UserData DTO
    $userData = new UserData(
        name: $user->name,
        email: $user->email,
        address: $user->address,
        phone: $user->phone
    );

    return response()->json($userData);
}

解釋:

  • 在這裡,我們透過將 User 模型的屬性傳遞到 DTO 建構函數來手動建立 UserData DTO。
  • 此DTO可直接作為JSON回應返回,確保結構化資料格式。

6. DTO 與集合

如果您正在處理資料集合,例如獲取使用者列表,DTO 套件也提供了一種簡單的方法來處理集合。

public function index()
{
    $users = User::all();

    // Convert the collection of User models to a collection of UserData DTOs
    $userCollection = UserData::collection($users);

    return response()->json($userCollection);
}

解釋:

  • UserData::collection($users) 方法將每個 User 模型對應到 UserData DTO,將整個集合轉換為 DTO 清單。

7. 自訂資料轉換

spatie/laravel-data 套件允許自訂轉換,例如重新命名屬性或新增計算欄位。

class UserData extends Data
{
    public function __construct(
        public string $name,
        public string $email,
        public string $address,
        public ?string $phone = null
    ) {}

    // Add a custom method to compute a full contact string
    public function fullContact(): string
    {
        return "{$this->name} ({$this->email})";
    }
}

現在,您可以在使用此 DTO 時使用 fullContact() 來取得自訂格式的字串。

8. 資料驗證和 DTO

您可以使用 Laravel Data 的規則功能直接在 DTO 中新增驗證規則。

namespace App\Data;

use Spatie\LaravelData\Attributes\Validation\Email;
use Spatie\LaravelData\Attributes\Validation\Required;
use Spatie\LaravelData\Data;

class UserData extends Data
{
    public function __construct(
        #[Required] public string $name,
        #[Email] public string $email,
        public string $address,
        public ?string $phone = null
    ) {}
}

解釋:

  • 借助 #[Required] 和 #[Email] 等驗證屬性,您可以直接在 DTO 層級強制執行驗證,從而進一步簡化流程。

結論

在本實作教學中,我們探討如何使用 Laravel Data 建立和使用資料傳輸物件 (DTO)。使用 DTO 模式,您可以乾淨地管理和轉換數據,確保應用程式各層之間的關注點分離,同時使程式碼更易於維護。 spatie/laravel-data 套件簡化了 DTO 管理,為開發人員和大型應用程式提供易於使用的功能。

版本聲明 本文轉載於:https://dev.to/mdarifulhaque/simplifying-data-transfer-in-laravel-with-dtos-1il7?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Fedora 24 伺服器和工作站上使用 MariaDB 和 PHP/PHP-FPM 設定 Nginx
    在 Fedora 24 伺服器和工作站上使用 MariaDB 和 PHP/PHP-FPM 設定 Nginx
    托管网站和在线应用程序需要设置 Web 服务器基础设施。在本文中,我们将尝试使用 MariaDB 和 PHP/PHP-FPM 了解在 Fedora 24 服务器和工作站上设置 Nginx。这种组合创建了一个强大的堆栈来管理数据库和呈现动态内容。这里介绍的主要概念可以应用于 Fedora 或其他 Li...
    程式設計 發佈於2024-11-07
  • 使用 React Hooks 和事件監聽器時,為什麼狀態控制台日誌顯示錯誤訊息?
    使用 React Hooks 和事件監聽器時,為什麼狀態控制台日誌顯示錯誤訊息?
    事件監聽器和React Hooks問題:使用React hooks和事件監聽器時,狀態控制台日誌顯示不正確的資訊。 問題描述考慮提供的CodeSandbox:https://codesandbox.io/s/lrxw1wr97m。當您按一下「新增卡片」按鈕兩次,然後按一下第一張卡片中的「Butto...
    程式設計 發佈於2024-11-07
  • 如何用Javascript實現IFRAME載入完成時的回呼?
    如何用Javascript實現IFRAME載入完成時的回呼?
    使用Javascript 回調載入Iframe要在IFRAME 完成載入時執行回調,請依照下列步驟操作: 建立IFRAME 與載入處理程序以程式設計方式建立IFRAME:var iFrameObj = document.createElement('IFRAME'); iFrameObj.src =...
    程式設計 發佈於2024-11-07
  • 如何管理部署到子資料夾的 MVC 應用程式的 URL 修改?
    如何管理部署到子資料夾的 MVC 應用程式的 URL 修改?
    了解應用程式子資料夾的URL 修改在開發部署到子資料夾的MVC 應用程式時,必須適應應用程式子資料夾的更改基本網址。這可確保 JavaScript 參考和 URL 在本機和部署環境中正常運作。 確定應用程式根的解決方案要確定根URL 並相應地修改JavaScript,有兩種方法:簡單方法:利用領先J...
    程式設計 發佈於2024-11-07
  • 如何將已知和未知鍵/值對的 JSON 解析為 Go 結構?
    如何將已知和未知鍵/值對的 JSON 解析為 Go 結構?
    使用任意鍵/值對解組JSON 到結構問題如何解析具有已知和未知鍵/值對的JSON 字符串進入Go 結構體?未知欄位可以具有任何名稱和值類型(字串、布林、float64 或 int)。 解決方案使用已知字段和未知字段的映射切片創建一個結構體:type Message struct { Know...
    程式設計 發佈於2024-11-07
  • [Go][Excelize] 確定儲存格值是否有刪除線
    [Go][Excelize] 確定儲存格值是否有刪除線
    簡介 我想確定儲存格的值是否有刪除線。 確定儲存格的值是否有刪除線 要確定儲存格的值是否有刪除線,我必須透過兩種方式取得儲存格樣式。 如果只有單元格的某些值被刪除,例如“A1”,我應該從“excelize.RichTextRun”取得單元格樣式。 如果單元格中...
    程式設計 發佈於2024-11-07
  • php:與進程的並發。角與 shmop 的進程間通信
    php:與進程的並發。角與 shmop 的進程間通信
    php isn't the sort of language where developers usually think about things like memory. we just sort of sling around variables and functions and let t...
    程式設計 發佈於2024-11-07
  • Kotlin vs. Java:Android 開發終極指南 4
    Kotlin vs. Java:Android 開發終極指南 4
    说到 Android 开发,争论最多的话题之一是 Kotlin 和 Java 之间的选择。两者都是功能强大的语言,各有优缺点,并且决策可以显着影响开发过程和最终产品。本博客将深入探讨 Kotlin 和 Java 的细微差别,从各个方面对它们进行比较,以帮助您决定哪种语言最适合您的 Android 开...
    程式設計 發佈於2024-11-07
  • 使用 Spring Boot 建立您的第一個微服務系統:初學者指南
    使用 Spring Boot 建立您的第一個微服務系統:初學者指南
    Introduction In this guide, we'll walk through the creation of a simple yet comprehensive microservices system using Spring Boot. We will cov...
    程式設計 發佈於2024-11-07
  • POST 請求能否觸發後退按鈕確認警報以及如何抑制它們?
    POST 請求能否觸發後退按鈕確認警報以及如何抑制它們?
    防止 POST 在按後退按鈕時確認警報透過 Web 表單提交大量參數時,經常使用 POST 請求而不是取得。但是,當使用者在頁面顯示後點選「後退」按鈕時,Firefox 會顯示確認警報。此警報警告 Firefox 將重新發送可能會重複先前操作的信息,例如搜尋或訂單確認。 雖然此行為可能旨在防止意外重...
    程式設計 發佈於2024-11-07
  • 用 PHP 建立一個簡單的頁面路由器
    用 PHP 建立一個簡單的頁面路由器
    建立文件 首先,我們將建立index.php、router.php和.htaccess檔案。 將所有請求重定向到.htaccess 中的index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f R...
    程式設計 發佈於2024-11-07
  • 如何使用 :focus-visible 實現僅鍵盤焦點樣式?
    如何使用 :focus-visible 實現僅鍵盤焦點樣式?
    現代瀏覽器中僅鍵盤焦點樣式在現代瀏覽器中,:focus-visible 偽類可以用來實現鍵盤-僅焦點樣式。當使用者透過鍵盤或其他非指點裝置與頁面互動時,此偽類會符合焦點元素,從而在幫助使用者時指示焦點。因此,當使用者透過點擊或點擊進​​行互動時,聚焦環會被抑制。 自訂焦點樣式:focus-visib...
    程式設計 發佈於2024-11-07
  • 將 Google 日曆連接到 Django 應用程式
    將 Google 日曆連接到 Django 應用程式
    将 Google 日历与 Django 应用程序无缝集成以增强日程安排和事件管理的分步指南。 将 Google 日历与您的 Django 应用程序集成可以通过启用日程安排、事件管理和日历同步来显着增强您的 Web 应用程序的功能。本指南将引导您完成将 Google 日历连接到 Django 应用程序...
    程式設計 發佈於2024-11-07
  • 掌握 React 路由:應用程式導航完整指南
    掌握 React 路由:應用程式導航完整指南
    1. React Router簡介 React Router 是一個用於在 React 應用程式中處理路由的函式庫。它允許您的應用程式在不同的元件和視圖之間導航,而無需重新載入整頁,從而實現無縫的用戶體驗。 2. 基本設定 先安裝react-router-dom:...
    程式設計 發佈於2024-11-07
  • 如何重命名Python字典中的鍵?
    如何重命名Python字典中的鍵?
    字典中的鍵重命名重命名字典鍵可以透過多種方式實現,具體取決於字典的類型以及您是否想要保持鍵的位置。 常規字典對於常規字典,可以使用以下語法重新命名鍵:mydict[k_new] = mydict.pop(k_old)此操作將項目移至字典的末端。如果 k_new 已經存在,它的值將會被覆寫。 Orde...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3