runopencode/doctrine-naming-strategy-bundle

一组有用的Doctrine2命名策略,适用于大型项目,允许您批量添加实体表名称前缀。

3.0.0 2020-03-17 14:21 UTC

README

Packagist Scrutinizer Code Quality Build Status Code Coverage Build Status

SensioLabsInsight

默认的Symfony2 Doctrine命名策略 doctrine.orm.naming_strategy.underscore 对于实体表来说非常好,我们通常不修改它来使用。然而,生成的表名有时可能过于模糊和冲突,尤其是在使用供应商包或有可能从以前的项目中重用一些代码的情况下。

常见的做法是,始终显式地控制实体表的命名。

然而,这对懒惰的开发者来说可能真的很痛苦。

修改命名策略来拯救

在Doctrine2中,可以轻松地控制命名策略(有关详细信息,请参阅这篇Doctrine "实现命名策略" 文章),而Symfony2在构建Doctrine服务的过程中,将命名策略实现作为服务获取(请参阅这个 Stackoverflow问题及答案)。

在这种情况下,此包的目的是为您提供额外的命名策略,这将允许您保持实体表的良好命名约定,防止表名冲突,并且仍然可以懒惰。

包中的命名策略

包中提供的命名策略包括

  • runopencode.doctrine.orm.naming_strategy.underscored_bundle_prefix:默认下划线命名策略的扩展,将为生成的表名添加包名称前缀(前缀中不包含"bundle")。
  • runopencode.doctrine.orm.naming_strategy.underscored_class_namespace_prefix:默认下划线命名策略的扩展,将为基于其命名空间的实体生成的表名添加配置的前缀。
  • runopencode.doctrine.orm.naming_strategy.underscored_namer_collection:下划线命名器集合是多个命名策略的集合,以及一个默认命名策略。默认命名策略将定义默认名称,然后咨询其他命名器。集合中第一个提供与默认名称不同名称的命名器最终确定名称。这将允许您混合命名策略,并且通过提供的命名器的白名单和黑名单,您可以批量微调表命名过程。

安装包

您可以使用composer安装此包

php composer require "runopencode/doctrine-naming-strategy-bundle"                            

或者您可以将包名称添加到您的 composer.json 文件中,并执行 php composer update 命令。

之后,您只需要将包添加到您的 config/bundles.php 文件中

<?php 

return [
    // ... other bundles
    RunOpenCode\Bundle\DoctrineNamingStrategy\DoctrineNamingStrategyBundle::class => [ 'all' => true ],
];               

并在您的项目 config/packages/doctrine.yml 中定义您想使用的命名策略

doctrine:
    orm:
        naming_strategy: [SERVICE NAME OF NAMING STRATEGY THAT YOU WOULD LIKE TO USE]

注意:仅在项目的早期阶段将此包添加到您的项目中才有意义,将表实体化到数据库之前。否则,如果未正确使用命名器和它们的白名单和黑名单定义,这将给您带来很大的问题。

命名策略配置选项

runopencode.doctrine.orm.naming_strategy.underscored_bundle_prefix 的选项

  • case:可选,枚举,可能的值:lowercaseuppercase。默认为 lowercase
  • map:可选,数组。包含束名和期望前缀的列表。否则,命名器将使用不带“Bundle”后缀的完整束名。如果您使用MySQL(例如,表名限制为最多60个字符)等数据库,这非常有用。
  • whitelist:可选,数组。需要添加表名前缀的束名列表。
  • blacklist:可选,数组。与whitelist相反,包含不应添加表名前缀的束名列表。
  • join_table_field_suffix:可选,布尔值。是否将字段名作为后缀添加到连接表名中。对于在相同实体之间有多个多对多关系的懒惰开发者来说,这非常有用,因为他们不必手动设置表名,以免发生表名冲突。默认值为true。

注意:您可以使用whitelistblacklist或都不用,但不能同时使用。

配置示例

runopencode_doctrine_naming_strategy:
    underscored_bundle_prefix:
        case: lowercase
        map:
            MyLongNameOfTheBundle: my_prefix
            MyOtherLongNameOfTheBundle: my_prefix_2
        blacklist:
            - DoNotPrefixThisBundle         

runopencode.doctrine.orm.naming_strategy.underscored_class_namespace_prefix的选项

  • case:可选,枚举,可能的值:lowercaseuppercase。默认为 lowercase
  • map:必需,数组。FQCN前缀和当命名器遇到给定FQCN前缀的实体类时使用的表前缀的映射。
  • whitelist:可选,数组。需要添加表名前缀的FQCN前缀列表。
  • blacklist:可选,数组。与whitelist相反,不应添加表名前缀的FQCN前缀列表。
  • join_table_field_suffix:可选,布尔值。是否将字段名作为后缀添加到连接表名中。对于在相同实体之间有多个多对多关系的懒惰开发者来说,这非常有用,因为他们不必手动设置表名,以免发生表名冲突。默认值为true。

注意:您可以使用whitelistblacklist或都不用,但不能同时使用。

配置示例

runopencode_doctrine_naming_strategy:
    underscored_class_namespace_prefix:
        case: uppercase
        map:
            My\Class\Namespace\Entity: my_prefix
        blacklist:
            - My\Class\Namespace\Entity\ThisShouldBeSkipped
            - My\Class\Namespace\Entity\ThisShouldBeSkippedAsWell

runopencode.doctrine.orm.naming_strategy.underscored_namer_collection的选项

  • default:可选,要使用的默认命名器。默认值是ORM的Symfony默认命名器doctrine.orm.naming_strategy.underscore
  • namers:要使用的命名器列表,用于提出与默认命名器提供名称不同的新名称。请注意,第一个不同的建议获胜。
  • join_table_field_suffix:可选,布尔值。是否将字段名作为后缀添加到连接表名中。对于在相同实体之间有多个多对多关系的懒惰开发者来说,这非常有用,因为他们不必手动设置表名,以免发生表名冲突。默认值为true。

配置示例

runopencode_doctrine_naming_strategy:         
    underscored_namer_collection:
        default: doctrine.orm.naming_strategy.underscore
        namers:
            - runopencode.doctrine.orm.naming_strategy.underscored_class_namespace_prefix
            - runopencode.doctrine.orm.naming_strategy.underscored_bundle_prefix            

已知问题

  • 某些数据库管理系统对表和/或列名中的字符数有一定的限制(例如,MySQL允许64个字符,阅读此文章以获取详细信息)。添加长前缀可能会轻松超过该限制。

开发

库附带Docker环境。您可以通过运行docker-compose up -d来启动环境,然后您可以通过运行bin/attach将容器附加到您的CLI。从容器中,您可以从composer.json文件中运行脚本以进行静态分析、检查代码风格以及运行测试。

要运行完整的构建,您需要安装ant,并且可以从主机的项目根目录运行它(在容器外)。