Устаревание: Doctrine \ 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 всегда ложно.

Этот класс вызывается в файле, который был автоматически сгенерирован 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

Но я не нашел ни одной опции, позволяющей знать число :(

leobrl
источник
3
Просто создайте свежий проект 4.4.0 (только что выпущенный, да), и в doctrine.yaml есть «naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware». Попробуйте настроить свою.
Серад

Ответы:

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. ком / доктрина / ОРМ / вопросы / 7855

До сих пор не совсем понятно, почему «они» решили так поступить, ну да ладно. Возможно, вы захотите запустить «bin / console doctrine: schema: update --dump-sql» просто чтобы посмотреть, влияет ли это на имена столбцов вашей базы данных и внести соответствующие изменения. Изменения уже несколько недель, и, кажется, не так много воплей возмущения по поводу этого изменения, поэтому я думаю, что в большинстве имен столбцов нет встроенных чисел. Пока, по крайней мере.

Cerad
источник
изменение старой стратегии (ошибочно), например, $ singleMd5Key на single_payu_md5key и новое (правильно) single_payu_md5_key. но потому что это BC перемены, у нас есть все это безобразие.
Томек Кобылинский
@ TomekKobyliński Удалось ли вам найти какую-либо документацию по этому вопросу, кроме самого кода? Все еще пытается понять, почему соглашение об именах изменится (и, следовательно, может вызвать изменение схемы базы данных), когда появится Doctrine 3. Просто кажется, что оба подхода будут поддерживаться.
Серад
1
Таким образом, вместо принудительного изменения схемы базы данных вы должны вручную обновить сопоставления сущностей? Не уверен, что хуже, и это на самом деле не решает вопрос, почему вообще измениться. Нет проблем с предоставлением более «правильной» стратегии, но я все еще не понимаю, почему оригинальная стратегия «неправильна» в каком-либо значимом смысле.
Cerad
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 является актуальной проблемой.
janh
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в c'tor заставит класс использовать NUMBER_AWARE_PATTERNвместоDEFAULT_PATTERN

private const DEFAULT_PATTERN      = '/(?<=[a-z])([A-Z])/';
private const NUMBER_AWARE_PATTERN = '/(?<=[a-z0-9])([A-Z])/';
nivpenso
источник