【问题标题】:Symfony2 DTO, Entity conversionSymfony2 DTO,实体转换
【发布时间】:2014-07-20 03:16:17
【问题描述】:

我正在使用教义 2 创建 symfony2 应用程序,我想就 DTO-Entity、Entity-DTO 转换的常见/良好做法征求意见。我找到了一些适用于所有语言和框架的信息,但没有找到适用于 SF2 的信息。

我想隔离实体,因此它们仅用于服务和 DAO(SF2 术语中的管理器、存储库)。控制器永远不会看到 DAO 或实体,只会通过服务与业务逻辑交互。服务和控制器之间的所有通信都应该通过原始类型、标量、DTO 完成。

例子:

控制器

class RegistrationController extends Controller
{
    public function registerAction($name)
    {
        $userDTO = new UserDTO();
        $form = $this->createForm(new UserType(), $userDTO);

        $form->handleRequest($request);

        if ($form->isValid()) {
            $userService = $this->get('userService');

            $userService->createUser($userDTO);

            return $this->redirect($this->generateUrl('success'));
        }

    --//--
    }
}

服务

class UserServiceImpl implements UserService
{

    private $userDao;

    public function __construct(UserDao $userDao)
    {
        $this->userDao = $userDao;
    }

    public function createUser(UserDTO $user)
    {
        $user = new User(); #doctrine entity
        $user->setFirstName($userDTO->getFirstName());
        $user->setLastName($userDTO->getLastName());

        $this->userDao->persist($user);
        $this->userDao->flush();

        --//--
    }
}

随着用户对象中属性数量的增加,问题很快就会出现。在我的应用程序中,用户有 13 个字段。是否有任何 SF2 工具(类)来简化此过程?您是否编写自己的转换器/变压器?您能否举例说明它的外观?梅比 PHP 魔术方法可以提供帮助吗?反射呢?

感谢您的建议和意见。

【问题讨论】:

    标签: php symfony architecture doctrine-orm dto


    【解决方案1】:

    首先在您的 dto 上使用公共属性。这消除了一堆真正不应该为 dto 做任何事情的 getter/setter 方法。您可以随时为特殊情况添加一些 majic 方法。

    接下来,重新考虑 DoctrineUserEntity 又名域对象的设计。你真的需要每个属性的getter/setter吗?如果是这样,那有什么意义呢?

    尝试将属性分组到值对象中:

    $userNameValueObject = new UserNameValueObject($userDto->firstName, $userDto->lastName);
    
    $userEntity = new UserEntity($userDTO->username,$userDTO->password, $userNameValueObject);
    
    // And maybe this for updates
    $userEntity->updateName($userNameValueObject);
    

    但同样,请确保您确实从工作中获得了一些价值。在域对象可以在请求之间保持活动的其他平台上,一堆一对一的映射可能是有意义的。在 php 中,一切都从零开始。

    【讨论】:

    • 我决定通过 dto/entities 中的构造函数注入属性。为了演示,我将使用 DQL 映射直接从 DB 中检索 DTO(新原则允许这样做)。
    • @Cerad 为什么这样的做法在对象在请求之间保持活动状态的平台上更有意义?
    【解决方案2】:

    我最近发现的一个选项是https://github.com/jasonrobertfox/DTOx,它是 DTO 和测试的生成器。它为您完成烦人的样板生成工作。

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2012-09-24
      • 2019-05-01
      • 2021-12-15
      • 2018-09-14
      相关资源
      最近更新 更多