「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > DTO を使用して Laravel でのデータ転送を簡素化する

DTO を使用して Laravel でのデータ転送を簡素化する

2024 年 11 月 7 日に公開
ブラウズ:464

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 を作成するとします。

次のアーティザン コマンドを実行して、新しい 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] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3