การเลิกใช้: 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;
}

ในคลาสนี้ Constructor จะถูกเรียกเสมอโดยไม่มีพารามิเตอร์ดังนั้น $ numberAware จึงเป็นเท็จเสมอ

คลาสนี้ถูกเรียกในไฟล์ซึ่งสร้างขึ้นโดยอัตโนมัติโดย Symfony Dependency Injection ดังนั้นฉันจึงไม่สามารถ "แก้ไข" มัน ...

ฉันคิดว่ามันอาจจะเป็นในหลักคำสอน 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

แต่ฉันไม่พบตัวเลือกใด ๆ เพื่ออนุญาตให้ทราบหมายเลข :(


3
เพียงแค่ทำให้โครงการ 4.4.0 (เพิ่งเปิดตัวใช่) และ doctrine.yaml มี "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware" ในนั้น ลองปรับแต่งของคุณ
Cerad

คำตอบ:


111

ในกรณีส่วนใหญ่ฉันเพียงแค่ตอบคำถามประเภทนี้ด้วยความคิดเห็น แต่ฉันสงสัยว่านักพัฒนารายอื่นอาจพบปัญหานี้ ฉันแหย่ไปเล็กน้อยและไม่พบเอกสารที่ชัดเจนเกี่ยวกับปัญหานี้ อาจเป็นเพราะ DoctrineBundle อยู่ภายใต้การควบคุมของกลุ่มหลักคำสอนไม่ใช่นักพัฒนา 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 co.th / คำสอน / ออม / ปัญหา / 7855

ยังไม่ชัดเจนว่าทำไม "พวกเขา" เลือกที่จะทำสิ่งนี้ด้วยวิธีนี้ แต่ทำได้ดี คุณอาจต้องการเรียกใช้ "หลักคำสอน bin / console: schema: update --dump-sql" เพียงเพื่อดูว่าสิ่งนี้ส่งผลกระทบต่อชื่อคอลัมน์ฐานข้อมูลของคุณและปรับตาม การเปลี่ยนแปลงได้เกิดขึ้นเป็นเวลาหลายสัปดาห์แล้วและดูเหมือนจะไม่มีความวุ่นวายมากมายในการเปลี่ยนแปลงดังนั้นฉันจึงเดาว่าชื่อคอลัมน์ส่วนใหญ่ไม่มีตัวเลขฝังตัว อย่างน้อยก็ตอนนี้


การเปลี่ยนแปลงกลยุทธ์เก่า (ไม่ถูกต้อง) เช่น $ singleMd5Key เป็น single_payu_md5key และอันใหม่ (ถูกต้อง) single_payu_md5_key แต่เพราะนั่นคือการเปลี่ยนแปลง BC เรามีทุกสิ่งที่
Tomek Kobyliński

@ TomekKobylińskiคุณสามารถค้นหาเอกสารเกี่ยวกับเรื่องนี้นอกเหนือจากรหัสได้หรือไม่? ยังคงดิ้นรนที่จะเข้าใจว่าทำไมรูปแบบการตั้งชื่อจึงเปลี่ยน (และอาจบังคับให้เปลี่ยนสคีมาฐานข้อมูล) เมื่อ Doctrine 3 มาถึง ดูเหมือนว่าทั้งสองแนวทางจะได้รับการสนับสนุน
Cerad

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.