Khái niệm, ý tưởng, chiến lược
Khái niệm, ý tưởng, chiến lượcPhân vùng tên schema để tránh xung đột

Phân vùng tên schema để tránh xung đột

Các nhà phát triển xuất bản plugin lên thư mục WordPress không biết trước ai sẽ sử dụng plugin của họ, hay cấu hình/môi trường của trang web sẽ như thế nào, kể cả những plugin khác có thể được cài đặt. Do đó, plugin phải được chuẩn bị để xử lý xung đột và cố gắng ngăn chặn chúng từ trước.

Một trong những cách để plugin WordPress tránh xung đột là thông qua phân vùng tên PHP. Namespace được sử dụng rộng rãi trong cộng đồng PHP, theo Khuyến nghị Tiêu chuẩn PHP PSR-4 để cho phép tự động tải Composer. Các gói PHP phải bao gồm tên nhà cung cấp, dạng "vendor-name/package-name", và namespace tương ứng có mặt trong mã PHP:

<?php
namespace VendorName\PackageName\ClassName;

Phân vùng tên cũng có ý nghĩa trong ngữ cảnh của GraphQL, để tránh các xung đột tiềm ẩn sau đây xảy ra trong schema:

  • Có hai kiểu có cùng tên
  • Có hai trường trên cùng một kiểu có cùng tên
  • Có hai chỉ thị có cùng tên

Phân vùng tên đã được đề xuất cho đặc tả GraphQL:

At the moment all GraphQL types share one global namespace. This is also true for all of the fields in mutation/subscription type. It can be a concern for bigger projects which may contain several loosely-coupled parts in a GraphQL schema.

Tuy nhiên, Lee Byron (một trong những người tạo ra GraphQL khi còn làm việc tại Facebook) cho rằng việc thêm phân vùng tên vào đặc tả là không cần thiết. Trong bình luận này, ông giải thích cách Facebook quản lý hàng nghìn kiểu trong schema GraphQL của mình mà không có xung đột:

We avoid naming collisions in two ways:

  1. integration tests.

We don't allow any commit to merge into our repository that would result in a broken GraphQL schema. [...]

  1. Common naming patterns.

We have common patterns for naming things which naturally avoid collision problems. [...]

Nhưng việc chiến lược này hiệu quả với Facebook không có nghĩa là nó sẽ hiệu quả trong WordPress: vì Facebook kiểm soát tất cả đầu vào cho schema GraphQL của mình, họ có thể tuân theo một quy trình để đặt tên cho các thực thể, đảm bảo rằng không có xung đột nào phát sinh. Nhưng một trang web WordPress phụ thuộc nhiều vào các plugin của bên thứ ba, và không kiểm soát cách các plugin này được tạo ra.

Ví dụ, nếu một trang web sử dụng cả plugin WooCommerce và Easy Digital Downloads, và cả hai đều có một kiểu tên Product cho schema GraphQL, sẽ xảy ra xung đột. Cách duy nhất để chủ trang web giải quyết là liên hệ với một trong các công ty và yêu cầu họ sửa đổi mã của mình. Đây không phải là phòng ngừa mà là khắc phục, và không đáng tin cậy.

Phân vùng tên khi đó có thể mang lại cho chủ sở hữu trang web WordPress sự yên tâm rằng mã của họ sẽ luôn hoạt động. Nếu hai kiểu có cùng tên Product, quản trị viên trang web có thể bật phân vùng tên trong schema GraphQL, và các kiểu này sẽ tự động được đổi tên thành WooCommerce_ProductEDD_Product, tránh được xung đột.

Là một lợi ích bổ sung, phân vùng tên làm cho schema GraphQL trở nên thanh lịch hơn: nếu WooCommerce muốn đảm bảo rằng không bao giờ xảy ra xung đột với plugin của mình, thì họ phải "phân vùng tên" các kiểu ngay trong tên kiểu: WCProduct, WCDownloadWCPayment (hoặc, để hoàn toàn chắc chắn rằng nó sẽ luôn hoạt động, có thể đặt tên chúng là WooCommerceProduct, WooCommerceDownloadWooCommercePayment). Nhờ phân vùng tên, các kiểu này có thể có tên tự nhiên hơn là Product, DownloadPayment.