Magento 2: Sự khác biệt giữa Mô hình và Mô hình Dữ liệu


13

Tôi biết rằng Magento 2 đã giới thiệu các mô hình dữ liệu như là một phần của kiến ​​trúc hợp đồng dịch vụ. Các mô hình dữ liệu thường thực hiện các giao diện được xác định trong Api / Dữ liệu / của một mô-đun.

Nhưng, Magento dường như cũng giữ lại các mô hình cũ.

Hãy lấy một ví dụ cho khách hàng mô-đun.

  • Giao diện mô hình dữ liệu được xác định trong Api / Data / CustomerInterface.php
  • Giao diện trên được triển khai trong Model / Data / Customer.php
  • Mô hình dữ liệu có tất cả hàm getter và setter cho các biến của khách hàng, như người ta mong đợi
  • Ngoài những thứ trên còn có Model / Customer.php. Điều này cũng có chức năng getter và setter. Đây giống như một mô hình Magento 1 kết nối với ResourceModel (Model / ResourceModel / Customer.php)
  • Trong Model / ResourceModel / CustomerRep repository.php, nhiều chức năng khác nhau thu thập dữ liệu từ mô hình Magnento 1, chuyển chúng sang mô hình dữ liệu và sau đó trả về mô hình dữ liệu.

Tại sao người ta cần mô hình cũ? Tại sao mô hình dữ liệu không thể kết nối trực tiếp với ResourceModel?

Câu trả lời:


7

Giải thích của tôi:

Rất khó để hiểu sự khác biệt giữa mô hình và mô hình dữ liệu. Nếu tôi phải nói bằng vài từ tôi có thể nói rằng một mô hình đại diện cho động cơ và một mô hình dữ liệu đại diện cho thông tin của nó .

Trong ví dụ của bạn, với thực thể khách hàng, bạn có thể xem ví dụ phương thức authenticatehoặc validatePasswordđược giữ trong mô hình khách hàng vì chúng là một phần của động cơ và họ sẽ không trực tiếp xử lý thông tin. Mặt khác, các phương thức như getExtensionAttributes, vì việc xử lý các mẩu thông tin được giữ trong mô hình dữ liệu.

Tôi nghĩ rằng đây chỉ là một xử lý dự án tốt hơn, giống như sự phân chia giữa các mô hình và mô hình tài nguyên, bạn có thể hỏi tại sao bạn cũng cần chúng.

Tại sao bạn cần chúng:

Nếu bạn muốn tiết lộ thông tin khách hàng (ví dụ) bằng API, bạn sẽ cần một giao diện ( \Magento\Customer\Api\Data\CustomerInterface) với các getters xác định tất cả các thuộc tính của thực thể của bạn và nếu bạn có bất kỳ phương thức getter nào khác không thể hiện thông tin bạn muốn phơi bày (ví dụ: getRandomConfirmationKey), bạn có một vấn đề!

Thi là tại sao, trong ví dụ của tôi, getRandomConfirmationKeylà một phần của mô hình ( \Magento\Customer\Model\Customer), trong khi getFirstnamelà một phần của mô hình dữ liệu.

Một quy tắc nhanh chóng có thể là:

  • Nếu phương thức của bạn đại diện cho một cột bảng, một thuộc tính hoặc thông tin thực thể thuộc bất kỳ loại nào, thì nên đi vào mô hình dữ liệu .
  • Nếu phương thức của bạn là "hành động" đối với thông tin, nó sẽ xử lý thông tin hoặc bạn khai báo nó trong webapi.xml , thì đó phải là một phương thức mô hình .

BÀI ĐĂNG:

Nói cách khác: hãy xem xét một mô hình dữ liệu gần như là một DTO.


Tất cả các phương thức \Magento\Customer\Api\Data\CustomerInterfaceđược hiển thị cho API REST / SOAP (nếu được bật). Tuy nhiên, bạn không cần một mô hình dữ liệu để chọn phương thức nào được hiển thị, vì bạn chỉ có thể kết nối giao diện với mô hình 'thực' thay thế. Đó là cách nó được thực hiện với \Magento\Catalog\Model\Product\Magento\Catalog\Api\Data\ProductInterface
Milan Simek

2

Thêm vào câu trả lời @ Phoenix128_RiccardoT, đáng chú ý là các kho lưu trữ (tức là MagentoCms\Api\BlockRepositoryhoặc Magento\Customer\Api\CustomerRepositoryInterface) cũng hy vọng rằng bạn sẽ cung cấp mô hình dữ liệu chứ không phải mô hình thông thường. Các mô hình dữ liệu là một lớp trừu tượng so với các mô hình chuẩn chỉ hiển thị dữ liệu do thực thể cung cấp. Tất cả "hành động" đối với dữ liệu này được chuyển đi nơi khác.

Nó trông hơi giống ý tưởng về thực thể trong Symfony2 và Symfony3 nơi các thực thể chỉ chứa dữ liệu và mọi thao tác dữ liệu đang diễn ra trong trình quản lý thực thể. Trong Magento2, vai trò này, tôi tin rằng, đã được trao cho các kho lưu trữ.

Các mô hình cũ vẫn còn với chúng tôi vì cách magento2 được phát triển. Rõ ràng là họ đã không bắt đầu từ index.php trống nhưng đã sử dụng lại một số mã từ M1. Khi bạn có một cái nhìn tại các phương pháp mô hình chuẩn ( load(), save()delete()) tất cả được đánh dấu là deprecated. Điều này là do công việc đó được chuyển đến kho lưu trữ (với điều kiện là trong một số trường hợp, tất cả các kho lưu trữ hiện đang gọi save()phương thức mô hình thông thường này nhưng con đường có vẻ rõ ràng đối với tôi).


1
Điều gì về mô hình dữ liệu sản phẩm. Khác không phải là mô hình dữ liệu sản phẩm
sivakumar

2

Các mô hình đóng gói logic nghiệp vụ lưu trữ độc lập, họ không biết về các công cụ hoặc trường hợp cơ sở dữ liệu, trong Mô hình dữ liệu Magento 2 là Đối tượng truyền dữ liệu (DTOs), triển khai các giao diện cụ thể DTO (mô hình dữ liệu) cho các mô hình CRUD Magento (mô hình ) xác định phương thức lớp nào có sẵn thông qua Magento WebAPI.

Model/Data/Customer.phpxác định phương thức nào khả dụng cho API trong khi Model/Customer.phpcó triển khai loại Magento 1 và setters tùy chỉnh có sẵn cho các hoạt động không phải API.

Model/ResourceModel/CustomerRepository.php là một phần của tính năng mới được giới thiệu trong Magento 2 - Hợp đồng dịch vụ, nó hoạt động với sự kết hợp của DTO (Mô hình dữ liệu).

Như chúng ta biết rằng Magento ORM bao gồm các Mô hình, Mô hình tài nguyên và Bộ sưu tập và phụ thuộc vào Cơ sở dữ liệu, mục đích của Hợp đồng dịch vụ là để ẩn logic lưu trữ để khách hàng được kết nối với Kho lưu trữ (Hợp đồng dịch vụ) không quan tâm đến việc lưu trữ mục tiêu động cơ.

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.