Veraltet: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy, ohne dass die Nummer bekannt gegeben wird, ist veraltet

53

Ich verwende Symfony 4.3.8 und kann keine Informationen zu diesen Verwerfungen finden:

Veralteter Benutzer: Das Erstellen von Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy, ohne dass die Nummer bekannt gegeben wird, ist veraltet und wird in Doctrine ORM 3.0 entfernt.

Das Erstellen von Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy ohne Bekanntgabe der Nummer ist veraltet und wird in Doctrine ORM 3.0 entfernt.

Ich habe in Stacktrace gesucht und Folgendes gefunden:

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

In dieser Klasse wird der Konstruktor immer ohne Parameter aufgerufen, daher ist $ numberAware immer falsch.

Diese Klasse wird in einer Datei aufgerufen, die von der Symfony Dependency Injection automatisch generiert wurde, sodass ich sie nicht "bearbeiten" kann ...

Ich dachte, vielleicht war es in der Lehre. 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

Ich habe jedoch keine Option gefunden, um die Nummer bekannt zu machen :(

leobrl
quelle
3
Machen Sie einfach ein neues 4.4.0-Projekt (gerade veröffentlicht, ja) und doctrine.yaml enthält "naming_strategy: doi.orm.naming_strategy.underscore_number_aware". Versuchen Sie, Ihre zu optimieren.
Cerad

Antworten:

111

In den meisten Fällen würde ich diese Art von Frage nur mit einem Kommentar beantworten, aber ich vermute, dass andere Entwickler auf dieses Problem stoßen könnten. Ich stöberte ein bisschen herum und konnte keine explizite Dokumentation zu diesem Thema finden. Vielleicht, weil das DoctrineBundle unter der Kontrolle der Doctrine-Leute und nicht der Symfony-Entwickler steht. Oder vielleicht bin ich nur ein schlechter Sucher.

In jedem Fall wurde zwischen 4.3 und 4.4 der Dienstname für die Unterstrich-Benennungsstrategie geändert.

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

Außerdem wurde eine Abschreibungsnachricht hinzugefügt, um Entwickler zu warnen, den Namen zu ändern. Wäre schön gewesen, wenn die Nachricht nur ein bisschen expliziter gewesen wäre, aber na ja. Wenn Sie also eine vorhandene App auf 4.4 und höher aktualisieren, müssen Sie Ihre Datei doctrine.yaml wahrscheinlich manuell bearbeiten, damit die Abschreibungsmeldung verschwindet.

Weitere Informationen (danke @janh), warum die Änderung vorgenommen wurde: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doctrine / orm / issue / 7855

Immer noch nicht wirklich klar, warum "sie" sich entschieden haben, die Dinge so zu machen, aber na ja. Sie möchten wahrscheinlich "bin / console doctrin: schema: update --dump-sql" ausführen, um festzustellen, ob sich dies auf die Namen Ihrer Datenbankspalten auswirkt, und diese entsprechend anpassen. Die Änderungen sind seit einigen Wochen nicht mehr verfügbar und es scheint nicht viel Empörung über die Änderung zu geben. Ich denke, die meisten Spaltennamen haben keine eingebetteten Nummern. Zumindest soweit.

Cerad
quelle
alte Strategieänderung (falsch) zum Beispiel $ singleMd5Key in single_payu_md5key und neue (korrekt) single_payu_md5_key. Aber weil das BC-Wechsel ist, haben wir all dieses Durcheinander.
Tomek Kobyliński
@ TomekKobyliński Konnten Sie neben dem Code selbst noch eine Dokumentation dazu finden? Es ist immer noch schwierig zu verstehen, warum sich die Namenskonvention ändern würde (und somit möglicherweise eine Änderung des Datenbankschemas erzwingen würde), wenn Doctrine 3 eintrifft. Es scheint nur, als würden beide Ansätze unterstützt.
Cerad
1
Anstatt eine Änderung des Datenbankschemas zu erzwingen, müssen Sie Ihre Entitätszuordnungen manuell aktualisieren. Ich bin mir nicht sicher, was schlimmer ist und es geht nicht wirklich um die Frage, warum sich überhaupt etwas ändert. Kein Problem mit der Bereitstellung einer "korrekteren" Strategie, aber ich verstehe immer noch nicht, warum die ursprüngliche Strategie in einem relevanten Sinne "falsch" ist.
Cerad
1
Kam hierher, nachdem ich in diese Abwertung eingetaucht war (gefunden durch Ausführen von phpunit). Es wäre gut, in der Antwort auf das Rezept yaml zu verlinken, da dies den vorgeschlagenen Fix bestätigt: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak
1
@Cerad Die Upgrade-Informationen der Doktrin enthalten etwas: github.com/doctrine/orm/blob/2.8.x/… Ich denke, github.com/doctrine/orm/issues/7855 ist das relevante Problem.
Janh