不建议使用:教义\ ORM \ Mapping \ UnderscoreNamingStrategy(不使其知道数字)已弃用


53

我正在使用Symfony 4.3.8,但找不到有关这些弃用的任何信息:

不推荐使用的用户:不建议使用创建Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy而不知道其编号的方法已被弃用,并将在Doctrine ORM 3.0中将其删除。

不赞成创建Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy而不通知其编号的做法已被弃用,并将在Doctrine ORM 3.0中将其删除。

我在stacktrace中搜索,发现了这一点:

class UnderscoreNamingStrategy implements NamingStrategy
{
private const DEFAULT_PATTERN      = '/(?<=[a-z])([A-Z])/';
private const NUMBER_AWARE_PATTERN = '/(?<=[a-z0-9])([A-Z])/';

/**
 * Underscore naming strategy construct.
 *
 * @param int $case CASE_LOWER | CASE_UPPER
 */
public function __construct($case = CASE_LOWER, bool $numberAware = false)
{
    if (! $numberAware) {
        @trigger_error(
            'Creating ' . self::class . ' without making it number aware is deprecated and will be removed in Doctrine ORM 3.0.',
            E_USER_DEPRECATED
        );
    }

    $this->case    = $case;
    $this->pattern = $numberAware ? self::NUMBER_AWARE_PATTERN : self::DEFAULT_PATTERN;
}

在此类中,构造函数始终不带参数调用,因此$ numberAware始终为false。

该类在由Symfony Dependency Injection自动生成的文件中调用,因此我无法对其进行“编辑”。

我以为可能是在doctrine.yaml中:

doctrine:
orm:
    auto_generate_proxy_classes: true
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true
    mappings:
        App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App

但是我还没有找到让数字知道的任何选择:(


3
只需创建一个新的4.4.0(是,刚刚发布)项目,doctrine.yaml中就会包含“ naming_strategy:doctrine.orm.naming_strategy.underscore_number_aware”。尝试调整您的。
Cerad

Answers:


111

在大多数情况下,我只会在评论中回答此类问题,但我怀疑其他开发人员可能会遇到此问题。我戳了一下,找不到关于此问题的任何明确文档。也许是因为DoctrineBundle是受Doctrine员工而不是Symfony开发人员控制的。也许我只是一个不好的搜索者。

无论如何,在4.3和4.4之间,下划线命名策略的服务名称已更改。

# doctrine.yaml
orm:
  # 4.3
  naming_strategy: doctrine.orm.naming_strategy.underscore
  # 4.4
  naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware

并且添加了折旧消息以警告开发人员更改名称。如果该消息稍微明确一点,那就好了,但是,哦。因此,如果要将现有应用程序升级到4.4及更高版本,则可能需要手动编辑doctrine.yaml文件以使折旧消息消失。

有关做出更改原因的更多信息(感谢@janh): https: //github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https://github.com com / doctrine / orm / issues / 7855

仍然不清楚为什么“他们”选择以这种方式做事,但是很好。您可能想运行“ bin / console doctrine:schema:update --dump-sql”,只是看这是否会影响数据库列名并进行相应调整。更改已经进行了几周,并且似乎对此更改并不感到愤怒,所以我想大多数列名称都没有嵌入数字。至少到目前为止。


旧策略更改(错误),例如将$ singleMd5Key更改为single_payu_md5key,将新策略更改(正确)为single_payu_md5_key。但是因为这是卑诗省的变化,所以我们一团糟。
TomekKobyliński,

@TomekKobyliński除了代码本身之外,您还能找到关于此的任何文档吗?仍在努力理解为什么在《 Doctrine 3》到来时命名约定会发生变化(从而可能迫使数据库架构发生更改)。似乎两种方法都将受到支持。
塞拉德(Cerad),

1
因此,不是强制更改数据库架构,而是必须手动更新实体映射?不知道哪一种情况更糟,它并没有真正解决为什么要改变的问题。提供更“正确”的策略没有问题,但是我仍然不明白为什么原始策略在任何相关意义上都是“错误的”。
塞拉德

1
深入了解这种弃用(通过运行phpunit找到)后也来到了这里。将是很好的链接,在回答配方YAML,为确认所提出的修正:github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/...
Rvanlaak

1
@Cerad该学说的升级信息中有一些内容:github.com/doctrine/orm/blob/2.8.x/…我认为github.com/doctrine/orm/issues/7855是相关问题。
1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.