Php Symfony:在条令实体方法中使用返回类型暗示的表单发布

Php Symfony:在条令实体方法中使用返回类型暗示的表单发布,php,symfony,doctrine-orm,php-7,return-type,Php,Symfony,Doctrine Orm,Php 7,Return Type,今天我非常勤奋,决定返回所有symfony实体方法的类型提示。因此: <?php Class User { private string $username; public method getUsername(): string {} } 显示表单时,Symfony会自动获取User$User的新实例的属性。但是由于它是一个新的实例化,它的username属性当然仍然是null,这是一个不正确的返回类型,因为它必须是string 我应该: 在Symfony实体(meh

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

<?php

Class User {
    private string $username;
    public method getUsername(): string {}
}
显示表单时,Symfony会自动获取
User$User
的新实例的属性。但是由于它是一个新的实例化,它的
username
属性当然仍然是
null
,这是一个不正确的返回类型,因为它必须是
string

我应该:

  • 在Symfony实体(meh)中没有返回类型提示
  • 设置
    $username=''
    (但这有点违背了不允许空白的目的,我可以看到各种错误的发展);或
  • 取消映射symfony表单上的字段
  • 其他可能的解决方案

  • 如果您使用的是PHP7.0,它不支持可为null的返回类型声明,那么第一个选项将是正确的(非hacky)选择。在使用PHP7.1+的情况下,可以定义一个


    如果实体属性不能为
    null
    (并且您使用的是PHP7.1+),则应用听起来更像是一种肮脏而快速的解决方法来维护实体和表单之间的直接数据绑定(使用Symfony表单组件)

    一个更好的全局方法(在我看来)是使用DTO(数据传输对象)将表单数据绑定与条令实体分离,DTO是一个简单的POPO(普通的旧PHP对象)来包含表单数据

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

    DTO允许重用,并具有许多其他优点

    关于将DTO与Symfony表单一起使用的一些有用参考资料:


    谢谢;这是更好的答案,因为它给了我更好的指导。Mikhail的当然也适用于php7.1,但确实比在实体getter中允许
    null
    要好得多,但是DTO中的getter也应该定义理想的返回类型!
    $user = new User();
    $this->createForm(SignupType::class, $user);
    
    <?php
    
    class User 
    {
        public function getUsername(): ?string {}
    }