【问题标题】:Type hinting with doctrine: Is the type attribute still required on @ORM\Column annotation when using PHP 7.4 with type hints?带有教义的类型提示:当使用带有类型提示的 PHP 7.4 时,@ORM\Column 注释上是否仍需要类型属性?
【发布时间】:2020-11-10 23:26:01
【问题描述】:

@ORM\Column 的原则文档说类型属性是必需的。这仍然适用于 PHP 7.4 吗?直接在 PHP 中使用类型提示,我觉得注释中的类型属性是多余的。有没有办法不提供类型属性并让教义从 PHP 类型提示中推断出来?

示例:

不使用此代码

class Client
{
    /** @ORM\Column(name="code"   , type="string" , length=20    , unique=true) */ private string $code;
    /** @ORM\Column(name="moduleX", type="boolean", nullable=true             ) */ private ?bool $moduleX;
    // [...]

我想写以下内容:

class Client
{
    /** @ORM\Column(name="code"   , length=20, unique=true) */ private string $code;
    /** @ORM\Column(name="moduleX",                       ) */ private ?bool $moduleX;
    // [...]

如果没有,是否正在讨论该功能 - 或者有什么方法可以推荐它?

【问题讨论】:

  • 当前版本的 Doctrine (2.7) 在 PHP 7.1 上运行,所以不,它不知道类型属性。您可以查看 github 站点并查看 Doctrine 3 的计划。我没有跟踪,但我怀疑 7.4 不是目标,因此没有类型属性。但我可能是错的。
  • 它也可以从属性中获取名称,但这不是重点。还有更多类型对应于学说类型中的字符串/浮点数/整数,因此它仍然必须是有条件的或默认选择。 ORM 是一个映射器,它在这个映射被定义的地方之一。
  • 即将推出的 Doctrine 版本 (3.0) 基于 PHP 7.2+。但这并不意味着它必须忽略 PHP 7.4 提供的可能性——它也可以在可用时很好地推断类型,因此在我看来“基于 PHP 7.2+”属性在这里并没有真正帮助。
  • 顺便说一句 “它也可以从属性中获取名称” 确实有效。

标签: php symfony doctrine-orm type-hinting php-7.4


【解决方案1】:

学说类型是conversion between PHP and SQL types。即使是像string 这样的简单 PHP 类型也可以是数据库中的 VARCHAR、DECIMAL 或 CLOB。

类型提示也可以是一个对象:

private UuidInterface $id;

如何将其存储在数据库中?字符串、二进制、整数?

Doctrine 不了解您的应用程序业务逻辑,因此我认为反射不是注释的良好替代品。

【讨论】:

  • 实际上并没有回答这个问题。更重要的是,Doctrine 有它自己的类型映射系统,并且通常会选择合理的默认值。例如,一个非常常见的 Doctrine 属性是“字符串”。不知何故,即使您不提供更详细的要求,Doctrine 也能正常工作。而且当 Doctrine 最终支持类型化属性时,它会足够聪明地将 UuidInterface 之类的东西映射到 guid 列。
  • 你说的没有错。尽管如此,在可能的情况下默认是一件非常好的(并且已经实现)的事情。沿着这条线,通过 ?int 和 ?bool 推断 int、bool 等类型,尤其是 nullable="true" 会非常有帮助。对于类,推理更加困难,我告诉你,但是 int 和 bool 是非常非常常见的类型,因此会覆盖大部分代码。
猜你喜欢
  • 2017-07-07
  • 2019-02-20
  • 2011-12-18
  • 2019-06-22
  • 2017-10-09
  • 2017-10-14
  • 2017-11-01
  • 2021-12-01
  • 2015-02-18
相关资源
最近更新 更多