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

时间:2019-11-21 12:33:35

标签: symfony doctrine-orm doctrine

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

  

不建议使用的用户:不建议用户创建Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy而已不知道其编号,则将在Doctrine ORM 3.0中将其删除。

     

不建议在不知道数字的情况下创建Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy,并将在Doctrine ORM 3.0中将其删除。

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

verbose 7.614802156 Error: https://npm.pkg.github.com/download/@tlabs/utils/1.0.1/afe9eaa6f9565f95c31563cbecfe617d7970f44077302cbe9ca8ee3223550469: Request failed "401 Unauthorized"
    at ResponseError.ExtendableBuiltin (/usr/share/yarn/lib/cli.js:696:66)
    at new ResponseError (/usr/share/yarn/lib/cli.js:802:124)
    at Request.<anonymous> (/usr/share/yarn/lib/cli.js:66996:16)
    at Request.emit (events.js:210:5)
    at Request.module.exports.Request.onRequestResponse (/usr/share/yarn/lib/cli.js:141441:10)
    at ClientRequest.emit (events.js:210:5)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:583:27)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17)
    at TLSSocket.socketOnData (_http_client.js:456:22)
    at TLSSocket.emit (events.js:210:5)
error An unexpected error occurred: "https://npm.pkg.github.com/download/@tlabs/utils/1.0.1/afe9eaa6f9565f95c31563cbecfe617d7970f44077302cbe9ca8ee3223550469: Request failed \"401 Unauthorized\"".

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

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

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

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;
}

但是我还没有找到任何允许数字识别的选项:(

2 个答案:

答案 0 :(得分:58)

在大多数情况下,我只会在评论中回答此类问题,但我怀疑其他开发人员可能会遇到此问题。我戳了一下,找不到关于此问题的任何明确文档。也许是因为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/doctrine/orm/issues/7855

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

答案 1 :(得分:0)

对于那些使用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])/';