Penghentian: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy tanpa membuatnya sadar nomor sudah usang

53

Saya menggunakan Symfony 4.3.8 dan saya tidak dapat menemukan informasi tentang penghentian mereka:

Penghentian Pengguna: Membuat Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy tanpa membuatnya sadar nomor sudah ditinggalkan dan akan dihapus di Doctrine ORM 3.0.

Membuat Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy tanpa membuatnya sadar nomor sudah usang dan akan dihapus di Doctrine ORM 3.0.

Saya mencari di stacktrace dan menemukan ini:

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

Di kelas ini, konstruktor selalu dipanggil tanpa params, jadi $ numberAware selalu salah.

Kelas ini disebut dalam file yang telah dibuat secara otomatis oleh Symfony Dependency Injection, jadi saya tidak dapat "mengedit" itu ...

Saya pikir mungkin itu ada di 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

Tapi saya belum menemukan opsi untuk mengizinkan nomor tersebut menyadari :(

leobrl
sumber
3
Buat saja proyek 4.4.0 (baru dirilis, ya) baru dan doctrine.yaml memiliki "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware" di dalamnya. Coba atur milik Anda.
Cerad

Jawaban:

111

Dalam kebanyakan kasus saya hanya akan menjawab pertanyaan semacam ini dengan komentar tapi saya curiga pengembang lain mungkin mengalami masalah ini. Saya mencari-cari sedikit dan tidak dapat menemukan dokumentasi eksplisit tentang masalah ini. Mungkin karena DoctrineBundle berada di bawah kendali orang-orang Doctrine dan bukan pengembang Symfony. Atau mungkin saya hanya seorang pencari yang buruk.

Dalam setiap kejadian, antara 4.3 dan 4.4 nama layanan untuk strategi penamaan garis bawah diubah.

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

Dan pesan penyusutan ditambahkan untuk memperingatkan pengembang untuk mengubah nama. Akan lebih baik jika pesannya hanya sedikit lebih eksplisit tapi oh well. Jadi, jika Anda meningkatkan aplikasi yang ada ke 4.4 dan lebih dari itu, Anda mungkin perlu mengedit file doctrine.yaml Anda secara manual untuk membuat pesan penyusutan hilang.

Beberapa info lebih lanjut (terima kasih @janh) tentang mengapa perubahan itu dibuat: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doctrine / orm / issues / 7855

Masih belum benar-benar jelas mengapa "mereka" memilih melakukan hal-hal seperti ini tetapi oh well. Anda mungkin ingin menjalankan "bin / console doctrine: schema: update --dump-sql" hanya untuk melihat apakah ini berdampak pada nama kolom basis data Anda dan sesuaikan. Perubahan telah keluar selama beberapa minggu sekarang dan tampaknya tidak ada banyak lolongan kemarahan atas perubahan jadi saya kira sebagian besar nama kolom tidak memiliki angka yang disematkan. Setidaknya sejauh ini.

Cerad
sumber
perubahan strategi lama (salah) misalnya $ singleMd5Key ke single_payu_md5key dan yang baru (dengan benar) single_payu_md5_key. tetapi karena itu adalah perubahan BC kita memiliki semua kekacauan itu.
Tomek Kobyliński
@ TomekKobyliński Apakah Anda dapat menemukan dokumentasi tentang ini selain kode itu sendiri? Masih berjuang untuk memahami mengapa konvensi penamaan akan berubah (dan dengan demikian mungkin memaksa perubahan skema database) ketika Ajaran 3 tiba. Sepertinya kedua pendekatan akan didukung.
Cerad
1
Jadi, alih-alih memaksa perubahan skema database, Anda harus memperbarui pemetaan entitas secara manual? Tidak yakin mana yang lebih buruk dan tidak benar-benar menjawab pertanyaan mengapa berubah sama sekali. Tidak ada masalah dengan memberikan strategi yang lebih "benar" tetapi saya masih tidak mengerti mengapa strategi asli "salah" dalam arti yang relevan.
Cerad
1
Datang ke sini setelah menyelam ke dalam penghinaan ini (ditemukan dengan menjalankan phpunit) juga. Akan lebih baik untuk menautkan ke resep yaml dalam jawabannya, karena itu mengkonfirmasi perbaikan yang diusulkan: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak
1
@ Cerad Ada sesuatu dalam info peningkatan doktrin: github.com/doctrine/orm/blob/2.8.x/... Saya pikir github.com/doctrine/orm/issues/7855 adalah masalah yang relevan.
janh