在PHP中创建具有特征的DTO
#发展 #php #cleancode #learning

数据传输对象(DTOS)是处理复杂数据结构的任何应用程序的重要组成部分。它们有助于封装数据,使操纵和传递代码库的不同部分之间更容易。但是,从头开始创建DTO可能是一个乏味而重复的过程,尤其是如果您有很多DTO可以创建。幸运的是,PHP对性状的支持可以帮助使过程变得更加容易,重复性更低。

在本文中,我们将详细介绍使用两个特征 - staticCreateSelf和Toarray创建Userdto类的示例,这些特征将有助于简化PHP应用程序中创建和使用DTO的过程。

PHP中的特征是什么?

在我们深入研究示例之前,让我们快速查看PHP中的特征。特征是在不使用继承的情况下重复使用多个类中代码的一种方法。它们允许您定义可以在多个类中使用的方法,而无需创建每个类继承的父类。当您需要在没有自然父母关系的类之间共享功能时,这可能特别有用。

示例:创建具有特征的用户do

在此示例中,我们将使用两个特征创建一个用户DTO类:staticCreateSelf和Toarray。 staticCreateSelf性状将提供静态 create()_Method,可用于从一个值数组中创建新的UserDTO。 Toarray特质将提供_toArray()方法,该方法将将用户do对象转换为关联数组。

这是Userdto类的样子:

    <?php

    declare(strict_types=1);

    namespace App\DTO;

    use App\Shared\Traits\StaticCreateSelf;
    use App\Shared\Traits\ToArray;

    class UserDTO
    {
        use StaticCreateSelf;
        use ToArray;

        public int $id;
        public string $name = '';
        public string $email = '';
    }

您可以看到,我们将Userdto类定义为具有三个公共属性: id name email 。我们还使用 use 关键字。

让我们首先仔细研究静态性特征。这里的外观:

    <?php

    declare(strict_types=1);

    namespace App\Shared\Traits;

    trait StaticCreateSelf
    {
        public static function create(array $values): self
        {
            $dto = new self();

            foreach ($values as $key => $value) {
                if (property_exists($dto, $key)) {
                    $dto->$key = $value;
                }
            }

            return $dto;
        }
    }

staticCreateSelf性状提供了A create()方法,该方法采用了一个关联的值,并返回类的新实例(在这种情况下为userdto)。该方法使用 new self()表达式创建类的新实例。然后,它在值数组上迭代,并在类的新实例上设置相应的属性。

toarray特征更简单。这里的外观:

 <?php

    declare(strict_types=1);

    namespace App\Shared\Traits;

    trait ToArray
    {
        public function toArray(): array
        {
            return get_object_vars($this);
        }
    }

toarray性状提供了 toarray()方法,该方法返回对象的关联数组表示。它通过调用 get_object_vars()函数来完成此操作,该功能返回所有对象属性及其值的关联数组。

userdto

现在我们已经定义了必要的特征,我们可以使用它们来创建 userdto 类。 userdto 类将定义DTO的属性,并使用 toArray staticCreateSelf 特征来提供必要的功能。这是 userdto 类的实现:

<?php

    declare(strict_types=1);

    namespace App\DTO;

    use App\Shared\Traits\StaticCreateSelf;
    use App\Shared\Traits\ToArray;

    class UserDTO
    {
        use StaticCreateSelf;
        use ToArray;

        public int $id;
        public string $name = '';
        public string $email = '';
    }

您可以看到, userdto 类使用 staticCreateSelf toArray 特征来提供必要的功能。 DTO的属性定义为公共属性,可以根据需要访问和修改。

使用 userdto

现在我们已经创建了 userdto 类,我们可以使用它在应用程序的不同层之间传输数据。这是如何使用 userdto 类创建DTO的新实例并将其转换为数组的示例:

    $userDTO = UserDTO::create([
        'id' => 1,
        'name' => 'John Doe',
        'email' => 'john.doe@example.com',
    ]);

    $userArray = $userDTO->toArray();

结论

dtos是改善代码中关注点并使您的应用程序更强大和可维护的有力工具。通过封装数据并使用DTO在不同层之间传输它,您可以确保您的应用程序不会与特定的数据结构紧密耦合,从而更容易随着时间的推移更改和发展。

此外,通过使用 toarray staticCreateSelf 之类的特征,我们已经展示了如何编写易于使用和维护的清洁和可重复使用的DTO。这些特征可能是编写自己的DTO的好起点,使您能够利用PHP面向对象的功能的功能,并创建易于阅读,理解和修改的代码。

那么,为什么不尝试一下呢?开始在下一个项目中使用DTO,然后查看它们如何帮助您编写更好,更可维护的代码。您的未来自我(和您的团队)将感谢您!