Kullanımdan kaldırılma: Doktrin \ ORM \ Mapping \ UnderscoreNamingStrategy, numarayı farkında olmadan, kullanımdan kaldırıldı


53

Symfony 4.3.8 kullanıyorum ve bu itirazlar hakkında herhangi bir bilgi bulamıyorum:

Kullanıcının Kullanımdan Kaldırılması: Doktrin Oluşturma \ ORM \ Mapping \ UnderscoreNamingStrategy, numarayı bilmeden kullanımdan kaldırılmıştır ve Doktrin ORM 3.0'da kaldırılacaktır.

Numarayı bilmeden Doktrin \ ORM \ Mapping \ UnderscoreNamingStrategy oluşturma işlemi kullanımdan kaldırılmıştır ve Doktrin ORM 3.0'da kaldırılacaktır.

Stacktrace içinde arama ve buldum:

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

Bu sınıfta, yapıcı her zaman parametresiz olarak çağrılır, bu nedenle $ numberAware her zaman yanlıştır.

Bu sınıf Symfony Bağımlılık Enjeksiyonu tarafından otomatik olarak oluşturulan dosyada çağrılır, bu yüzden "düzenleyemem" ...

Belki doctrine.yaml'de olduğunu düşündüm:

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

Ama sayının farkında olmasına izin vermek için herhangi bir seçenek bulamadım :(


3
Sadece yeni bir 4.4.0 (yeni yayınlandı, evet) projesi yapın ve doctrine.yaml dosyasında "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware" var. Sizinkini değiştirmeyi deneyin.
Cerad

Yanıtlar:


111

Çoğu durumda bu tür bir soruyu bir yorumla cevaplarım ama diğer geliştiricilerin bu sorunla karşılaşabileceğinden şüpheleniyorum. Biraz dürttüm ve bu konuda herhangi bir açık belge bulamadım. Belki de DoctrineBundle, Symfony geliştiricilerinin değil, Doktrin milletinin kontrolü altında olduğu için. Ya da ben sadece kötü bir araştırmacıyım.

Her durumda, 4.3 ve 4.4 arasında alt çizgi adlandırma stratejisinin hizmet adı değiştirildi.

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

Ve geliştiricileri adı değiştirmeleri konusunda uyarmak için bir amortisman mesajı eklendi. Mesaj sadece biraz daha açık ama oh iyi olsaydı güzel olurdu. Bu nedenle, mevcut bir uygulamayı 4.4 ve daha yeni bir sürüme geçiriyorsanız, amortisman mesajını ortadan kaldırmak için muhtemelen doctrine.yaml dosyanızı düzenlemeniz gerekir.

Değişikliğin neden yapıldığı hakkında daha fazla bilgi (teşekkürler @janh): https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doktrin / orm / sorunlar / 7855

Hala neden "onlar" şeyleri bu şekilde yapmayı seçti gerçekten açık değil ama iyi. Muhtemelen bunun yalnızca veritabanı sütun adlarınızı etkileyip etkilemediğini görmek ve buna göre ayarlama yapmak için "bin / console doctrine: schema: update --dump-sql" çalıştırmak istiyorsunuz. Değişiklikler şimdi birkaç hafta oldu ve değişiklik üzerinde öfke çok uluyor gibi görünmüyor, bu yüzden çoğu sütun adının katıştırılmış sayıları yok sanırım. En azından şimdiye kadar.


eski strateji değişikliği (yanlış) örneğin $ singleMd5Key öğesini single_payu_md5key ve yenisine (doğru) single_payu_md5_key. ama BC değişti çünkü tüm bu karışıklığa sahibiz.
Tomek Kobyliński

@ TomekKobyliński Bu konuda kodun dışında herhangi bir belge bulabildiniz mi? Doktrin 3 geldiğinde, adlandırma kuralının neden değişeceğini (ve muhtemelen bir veritabanı şeması değişikliğini zorlayacağını) anlamak için hala mücadele ediyor. Her iki yaklaşım da desteklenecek gibi görünüyor.
Cerad

1
Yani bir veritabanı şeması değişikliğini zorlamak yerine varlık eşlemelerinizi manuel olarak mı güncellemelisiniz? Hangisinin daha kötü olduğundan emin değilim ve neden değişimin neden olduğu sorusunu gerçekten ele almıyor. Daha "doğru" bir strateji sağlamakta sorun yok ama yine de orijinal stratejinin neden herhangi bir anlamda "yanlış" olduğunu anlamıyorum.
Cerad

1
Bu deprecation (phpunit çalışarak bulundu) daldıktan sonra buraya geldi. Önerilen düzeltmeyi onayladığı için, cevaptaki yaml reçetesine bağlanmak iyi olur: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak 4:09

1
@Cerad Doktrin yükseltme bilgisinde bir şey var: github.com/doctrine/orm/blob/2.8.x/… Bence ilgili konu github.com/doctrine/orm/issues/7855 .
janh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.