Khấu hao: Học thuyết \ ORM \ Mapping \ UnderscoreNamingStrargety mà không làm cho nó nhận biết số bị phản đối


53

Tôi đang sử dụng Symfony 4.3.8 và tôi không thể tìm thấy bất kỳ thông tin nào về việc khấu hao:

Người dùng không dùng nữa: Tạo Học thuyết \ ORM \ Mapping \ UnderscoreNamingStrargety mà không làm cho số nhận biết bị phản đối và sẽ bị xóa trong Doctrine ORM 3.0.

Tạo học thuyết \ ORM \ Mapping \ UnderscoreNamingStrargety mà không làm cho số nhận biết bị phản đối và sẽ bị xóa trong Doctrine ORM 3.0.

Tôi đã tìm kiếm trong stacktrace và tìm thấy điều này:

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

Trong lớp này, hàm tạo luôn được gọi mà không có tham số, vì vậy $ numberAware luôn sai.

Lớp này được gọi trong tệp đã được tạo tự động bởi Symfony Dependency Injection, vì vậy tôi không thể "chỉnh sửa" nó ...

Tôi nghĩ có lẽ đó là trong học thuyết.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

Nhưng tôi không tìm thấy bất kỳ tùy chọn nào để cho phép số nhận biết :(


3
Chỉ cần tạo một dự án 4.4.0 (vừa được phát hành, yea) và doctrine.yaml có "naming_strargety: doctrine.orm.naming_strargety.underscore_number_war" trong đó. Hãy thử tinh chỉnh của bạn.
Cerad

Câu trả lời:


111

Trong hầu hết các trường hợp, tôi chỉ trả lời loại câu hỏi này bằng một bình luận nhưng tôi nghi ngờ các nhà phát triển khác có thể gặp phải vấn đề này. Tôi chọc một chút và không thể tìm thấy bất kỳ tài liệu rõ ràng về vấn đề này. Có lẽ bởi vì DoctrineBundle nằm dưới sự kiểm soát của dân tộc Doctrine chứ không phải nhà phát triển Symfony. Hoặc có thể tôi chỉ là một người tìm kiếm tồi.

Trong mọi trường hợp, từ 4.3 đến 4.4, tên dịch vụ cho chiến lược đặt tên gạch dưới đã được thay đổi.

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

Và một thông báo khấu hao đã được thêm vào để cảnh báo các nhà phát triển thay đổi tên. Sẽ thật tuyệt nếu tin nhắn chỉ rõ ràng hơn một chút nhưng ồ. Vì vậy, nếu bạn đang nâng cấp một ứng dụng hiện có lên 4.4 trở lên thì có lẽ bạn sẽ cần phải chỉnh sửa thủ công tệp doctrine.yaml của mình để làm cho thông báo khấu hao biến mất.

Một số thông tin khác (cảm ơn @janh) về lý do thay đổi được thực hiện: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unwar-doctrineormmappingunderscorenamingstrargety https: // github. com / học thuyết / orm / vấn đề / 7855

Vẫn chưa thực sự rõ ràng về lý do tại sao "họ" chọn làm mọi thứ theo cách này nhưng ồ. Bạn có thể muốn chạy "học thuyết bin / console: lược đồ: update --dump-sql" để xem điều này có ảnh hưởng đến tên cột cơ sở dữ liệu của bạn không và điều chỉnh cho phù hợp. Các thay đổi đã được đưa ra trong vài tuần nay và dường như không có nhiều tiếng ồn ào về sự thay đổi nên tôi đoán hầu hết các tên cột không có số nhúng. Ít nhất là cho đến nay.


thay đổi chiến lược cũ (sai), ví dụ $ singleMd5Key thành single_payu_md5key và chiến lược mới (chính xác) single_payu_md5_key. Nhưng vì đó là sự thay đổi BC, chúng ta có tất cả những thứ lộn xộn đó.
Tomek Kobyliński

@ TomekKobyliński Bạn đã có thể tìm thấy bất kỳ tài liệu nào về điều này ngoài chính mã chưa? Vẫn đang cố gắng để hiểu tại sao quy ước đặt tên sẽ thay đổi (và do đó có thể buộc thay đổi lược đồ cơ sở dữ liệu) khi Doctrine 3 xuất hiện. Có vẻ như cả hai phương pháp sẽ được hỗ trợ.
Cerad

1
Vì vậy, thay vì buộc thay đổi lược đồ cơ sở dữ liệu, bạn phải cập nhật thủ công ánh xạ thực thể của mình? Không chắc cái nào tệ hơn và nó không thực sự giải quyết được câu hỏi tại sao lại thay đổi cả. Không có vấn đề gì với việc cung cấp một chiến lược "đúng" hơn nhưng tôi vẫn không hiểu tại sao chiến lược ban đầu lại "sai" theo bất kỳ ý nghĩa liên quan nào.
Cerad

1
Đến đây sau khi đi sâu vào sự phản đối này (được tìm thấy bằng cách chạy phpunit). Sẽ rất tốt nếu liên kết đến công thức yaml trong câu trả lời, vì điều đó xác nhận cách khắc phục được đề xuất: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/
tựa

1
@Cerad Có một cái gì đó trong thông tin nâng cấp của học thuyết: github.com/doctrine/orm/blob/2.8.x/. Tôi nghĩ github.com/doctrine/orm/issues/7855 là vấn đề có liên quan.
janh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.