【问题标题】:Doctrine 2 ORM creates classes with hateful CamelCaseDoctrine 2 ORM 使用可恶的 CamelCase 创建类
【发布时间】:2011-09-27 18:06:17
【问题描述】:

我为 Doctrine 创建了 yaml 配置。当我尝试doctrine orm:generate-entities 时,它会创建带有 getter 和 setter 的 php 文件。因此,is_public 字段转换为 setIsPublicgetIsPublic 方法。真可惜。我怎样才能得到set_is_publicget_is_public?我可以手动编辑生成的 php 文件,但我不知道更改架构时会发生什么。

【问题讨论】:

  • 我不得不同意你的观点是一种不常见的方法命名。考虑到您的平台 (PHP) 本身对内置对象使用驼峰式方法名称,您肯定会违反规定。然而,这是一个有趣的问题,所以我投了赞成票(取消了其他一些可恨的反对票)

标签: doctrine-orm getter-setter camelcasing


【解决方案1】:

您可以choose a naming strategy Doctrine 将使用以下方式生成项目:

使用命名策略,您可以自动提供规则 生成数据库标识符、列和表名时 未给出表/列名称。此功能有助于减少 映射文档的详细程度,消除重复的噪音(例如: 表_)。

对于您的具体情况,我认为您正在查看以下内容:

$namingStrategy = new \Doctrine\ORM\Mapping\UnderscoreNamingStrategy(CASE_LOWER);
$configuration()->setNamingStrategy($namingStrategy);

链接的主题继续向您展示如何编写自己的自定义命名策略。

如果您使用 Symfony,请通过config.ymleven easier(就像大多数使用 Symfony 一样,但这只是我的意见):

doctrine:
    orm:
        naming_strategy: doctrine.orm.naming_strategy.underscore

【讨论】:

  • 也许您应该添加 ... 使用下划线将需要在您的 @ORM\Column annotation 中添加一个额外的 name="user_id" 参数
  • 我的理解是,告诉 Doctrine 使用特定的命名策略将消除您自己显式地使变量与列名称关系相关的需要。既然你已经告诉了 Doctrine,它就知道该怎么做了。
  • 我认为提供替代的@ORM\Column注解会很有趣,它只在需要时使用,而不需要修改全局命名策略。
【解决方案2】:

Symfony's coding standards 鼓励 Symfony 用户使用 camelCase

命名约定

对变量使用驼峰式,而不是下划线, 函数和方法名称、参数

【讨论】:

  • 这不是 Doctrine 编码标准规则——它是 Symfony 的。 Doctrine 似乎没有为变量名强制执行特定的大小写,但是,鉴于它最终是 PHP,骆驼大小写是一个不错的选择。请注意,当您的表列名称使用下划线时,使用驼峰式大小写将需要在您的 @ORM\Column 注释中添加一个额外的 name="user_id" 参数。
  • @aalaap 谢谢,我不知道为什么我在引用和链接 Symfony 文档时写它是一个教义。我会更新我的答案。
  • @aalaap 随意添加与您的评论内容相同的答案。我的回答跑题了。
  • 我做到了。太糟糕了,OP 可能永远不会看到这个。
【解决方案3】:

个人建议 - 不要通过学说 orm:generate-entities 生成实体。
使用纯 PHP 创建类。为什么?
Orm 在 privates 上使用 reflection 与数据库通信。您不需要生成 setter 和 getter。我建议您使用工厂或构造函数等设计模式来实现您的目标。装饰器也应该可以正常工作。

<?php

class MyClass
{
    private $id;
    private $name;

    public function __construct(int $id, string $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}


$camelCase 不仅是 Symfony 对代码标准的推荐。它基于 PSR2。我强烈推荐使用 PSR2,代码变得干净和标准化。
标准 ORM 命名策略是 $camelCase 私有 var 到 snake_case 列名。如果您想以其他方式更改它,请考虑:other naming stategies

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多