弃用:未使Doctrine\ORM\Mapping\UnderscoreNamingStrategy具备数字感知能力已被弃用

87

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

User Deprecated:创建Doctrine\ORM\Mapping\UnderscoreNamingStrategy而不使其具有数字意识已经被弃用,并将在Doctrine ORM 3.0中删除。

创建Doctrine\ORM\Mapping\UnderscoreNamingStrategy而不使其具有数字意识已经被弃用,并将在Doctrine ORM 3.0中删除。

我在堆栈跟踪中搜索并找到了这个:

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依赖注入自动生成的,所以我不能“编辑”它...

我认为可能是在 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

但是我没有找到任何选项来允许数字感知 :(


5
请新建一个最新版本的项目(4.4.0),在doctrine.yaml文件中添加"naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware"。如果需要,可以自行调整该设置。 - Cerad
2个回答

193
在大多数情况下,我通常只会用评论来回答这类问题,但我怀疑其他开发人员可能会遇到此问题。我稍微查了一下,没有找到关于此问题的明确文档。也许是因为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文件以使 depreciated 消息消失。

关于为什么要进行此更改的更多信息(感谢 @janh):

对于“他们”为什么选择以这种方式处理仍然不太清楚,但也无所谓。

您可能想要运行“bin/console doctrine:schema:update --dump-sql”,只是为了查看这是否会影响您的数据库列名,并进行相应的调整。该更改已经发布几周了,似乎没有太多愤怒的声音,因此我猜测大多数列名称都没有嵌入数字。至少目前是这样。


1
那么,你必须手动更新实体映射,而不是强制更改数据库模式?我不确定哪个更糟糕,而且这并没有真正回答为什么要进行更改的问题。提供一个更“正确”的策略没有问题,但我仍然不明白为什么原始策略在任何相关意义上都是“错误”的。 - Cerad
1
我也因运行phpunit而发现了这个弃用警告,并来到这里。最好在答案中链接配方yaml文件,以确认所提出的修复措施:https://github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/2.0/config/packages/doctrine.yaml - Rvanlaak
2
@Cerad,Doctrine 的升级信息中有一些内容:https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy 我认为 https://github.com/doctrine/orm/issues/7855 是相关的问题。 - janh
那么我们如何消除弃用日志消息呢?我尝试添加underscore_number_aware,但返回ServiceNotFoundException。 - ESP32
从4.3更改为#4.4 naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware这会导致一些现有的表无法读取,您需要重新创建它们。如果您已经有数据存在其中,修复可能会成为一个问题。 - undefined
显示剩余5条评论

1

对于那些使用symfony4.3的人,如果仍希望消除此警告,可以在service.yaml中添加新的服务定义。

    custom_doctrine_orm_naming_strategy_underscore:
    class: Doctrine\ORM\Mapping\UnderscoreNamingStrategy
    arguments:
        - 0
        - true

并将doctrine.yaml的配置更改为以下内容:

orm:
    naming_strategy: custom_doctrine_orm_naming_strategy_underscore

在直接提交此更改之前,我建议您验证将true传递给Doctrine\ORM\Mapping\UnderscoreNamingStrategy是否不会影响代码的预期行为。
// class UnderscoreNamingStrategy
/**
 * 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;
}

提示:

true传递给构造函数将使该类使用NUMBER_AWARE_PATTERN而不是DEFAULT_PATTERN

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

1
如果您已经打算切换到新的数字感知策略,为什么不直接在Doctrine配置中更新策略,而不是使用这个hack呢? - gronostaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接