Symfony:在Doctrine实体方法中使用返回类型提示的表单问题

blu*_*isk 7 php return-type symfony doctrine-orm php-7

今天我非常勤奋,并决定返回类型提示我所有的symfony实体方法.所以:

<?php

Class User {
    private string $username;
    public method getUsername(): string {}
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我创建一个表单来创建一个新用户:

$user = new User();
$this->createForm(SignupType::class, $user);
Run Code Online (Sandbox Code Playgroud)

显示表单时,Symfony会自动获取此新实例的属性User $user.但由于它是一个新的实例化,它的username属性当然仍然是null,这是一个不正确的返回类型,因为它需要string.

我应该:

  1. 在Symfony实体中没有返回类型的暗示(meh);
  2. 设置$username = ''(但是帽子有点违背了不允许空白的目的,我可以看到各种各样的错误演变); 要么
  3. 取消映射symfony表单上的字段
  4. 其他可能的方案...

gp_*_*ver 22

如果实体属性不能null(并且您使用PHP 7.1+),则应用可空返回类型声明听起来更像是一种肮脏且快速的解决方法,以维护实体和表单之间的直接数据绑定(使用Symfony表单组件).

更好的全局方法(在我看来)是使用DTO(数据传输对象)将表单数据绑定与您的Doctrine实体分离,这是一个简单的POPO(Plain Old PHP Object)来包含表单数据.

使用DTO将允许您在Doctrine实体中保持严格的类型提示(不会丢失数据一致性),并将从您的实体中分离表单数据绑定(以及数据验证).

DTO允许可重用​​性并具有许多其他优点.

关于在Symfony Forms中使用DTO的一些有用的参考:

  • 谢谢; 这是更好的答案,因为它给了我更好的指导。Mikhail 当然也可以在 php7.1 中工作,但确实有点 hacky (2认同)