Magento 2: ความแตกต่างระหว่างตัวแบบและตัวแบบข้อมูล


13

ฉันทราบว่า Magento 2 แนะนำตัวแบบข้อมูลเป็นส่วนหนึ่งของสถาปัตยกรรมสัญญาการบริการ โมเดลข้อมูลมักจะใช้อินเตอร์เฟสที่กำหนดไว้ใน Api / Data / ของโมดูล

แต่ดูเหมือนว่าวีโอไอพีจะยังคงรักษาโมเดลเก่าไว้เช่นกัน

ลองมาตัวอย่างให้กับลูกค้าโมดูล

  • อินเตอร์เฟสโมเดลข้อมูลที่กำหนดไว้ใน Api / Data / CustomerInterface.php
  • อินเทอร์เฟซข้างต้นถูกนำไปใช้ใน Model / Data / Customer.php
  • ตัวแบบข้อมูลมีฟังก์ชัน getter และ setter ทั้งหมดสำหรับตัวแปรลูกค้าตามที่คาดหวัง
  • นอกจากข้างต้นแล้วยังมี Model / Customer.php นี้ก็มีฟังก์ชั่น getter และ setter นี่เป็นเหมือนโมเดล Magento 1 ที่เชื่อมต่อกับ ResourceModel (Model / ResourceModel / Customer.php)
  • ใน Model / ResourceModel / CustomerRepository.php ฟังก์ชั่นต่าง ๆ จะรวบรวมข้อมูลจากโมเดล Magnento 1 โอนไปยังโมเดลข้อมูลจากนั้นส่งคืนโมเดลข้อมูล

ทำไมต้องมีรุ่นเก่า เหตุใดโมเดลข้อมูลไม่สามารถเชื่อมต่อโดยตรงกับ ResourceModel ได้

คำตอบ:


7

คำอธิบายของฉัน:

เป็นการยากที่จะเข้าใจความแตกต่างระหว่างตัวแบบและตัวแบบข้อมูล ถ้าฉันจะพูดคำไม่กี่คำที่ฉันสามารถพูดได้ว่ารูปแบบหมายถึงเครื่องมือและรูปแบบข้อมูลที่แสดงให้เห็นถึงของข้อมูล

ในตัวอย่างของคุณกับเอนทิตีลูกค้าคุณสามารถดูตัวอย่างวิธีการauthenticateหรือวิธีการvalidatePasswordเก็บไว้ในแบบจำลองลูกค้าเนื่องจากเป็นส่วนหนึ่งของเครื่องยนต์และพวกเขาจะไม่จัดการข้อมูลโดยตรง ในอีกด้านหนึ่งวิธีการเช่นgetExtensionAttributesเนื่องจากการจัดการข้อมูลจะถูกเก็บไว้ในตัวแบบข้อมูล

ฉันคิดว่านี่เป็นเพียงการจัดการโครงการที่ดีกว่าเช่นเดียวกับการแบ่งระหว่างโมเดลและโมเดลทรัพยากรคุณสามารถถามว่าทำไมคุณถึงต้องการมันเช่นกัน

ทำไมคุณต้องการ:

หากคุณต้องการที่จะเปิดเผยข้อมูลของลูกค้า (ตัวอย่าง) โดยใช้ API คุณจะต้องมีอินเตอร์เฟซ ( \Magento\Customer\Api\Data\CustomerInterface) กับgettersกำหนดคุณลักษณะทั้งหมดของกิจการของคุณและถ้าคุณมีอื่น ๆวิธีทะเยอทะยานไม่ได้เป็นตัวแทนของข้อมูลที่คุณต้องการที่จะเปิดเผย (เช่น: getRandomConfirmationKey), คุณมีปัญหา!

Thi เป็นสาเหตุในตัวอย่างของฉันgetRandomConfirmationKeyเป็นส่วนหนึ่งของ model ( \Magento\Customer\Model\Customer) ในขณะที่getFirstnameเป็นส่วนหนึ่งของตัวแบบข้อมูล

กฎอย่างรวดเร็วอาจเป็น:

  • หากวิธีการของคุณหมายถึงคอลัมน์ตารางแอตทริบิวต์หรือข้อมูลนิติบุคคลใด ๆ แล้วควรจะไปลงในรูปแบบข้อมูล
  • หากวิธีการของคุณคือ "การกระทำ" กับข้อมูลนั้นจะจัดการข้อมูลหรือคุณประกาศในwebapi.xmlก็ควรเป็นวิธีการแบบ

โพสต์:

กล่าวโดยสรุป: พิจารณาตัวแบบข้อมูลเกือบเป็นแบบ DTO


วิธีการทั้งหมด\Magento\Customer\Api\Data\CustomerInterfaceจะถูกเปิดเผยสำหรับ REST / SOAP API (ถ้าเปิดใช้งาน) อย่างไรก็ตามคุณไม่จำเป็นต้องมีแบบจำลองข้อมูลเพื่อเลือกวิธีการที่จะเปิดเผยเนื่องจากคุณสามารถเชื่อมต่ออินเทอร์เฟซกับรูปแบบ 'ของจริง' แทน นั่นคือวิธีที่มันทำกับ\Magento\Catalog\Model\Productและ\Magento\Catalog\Api\Data\ProductInterface
มิลาน Simek

2

การเพิ่มใน @ Phoenix128_RiccardoT คำตอบที่ควรสังเกตคือที่เก็บ (เช่น. MagentoCms\Api\BlockRepositoryหรือMagento\Customer\Api\CustomerRepositoryInterface) คาดหวังว่าคุณจะให้แบบจำลองข้อมูลและไม่ใช่แบบปกติ ตัวแบบข้อมูลเป็นเลเยอร์นามธรรมที่อยู่เหนือตัวแบบมาตรฐานซึ่งจะเปิดเผยเฉพาะข้อมูลที่ได้รับจากเอนทิตี "การกระทำ" ทั้งหมดในข้อมูลนี้จะถูกย้ายไปที่อื่น

ดูเหมือนแนวคิดของเอนทิตีใน Symfony2 และ Symfony3 เล็กน้อยซึ่งเอนทิตีประกอบด้วยข้อมูลเท่านั้นและการจัดการข้อมูลใด ๆ ที่เกิดขึ้นในตัวจัดการเอนทิตี ใน Magento2 บทบาทนี้ฉันเชื่อว่าถูกมอบให้กับที่เก็บ

รุ่นเก่ายังอยู่กับเราเพราะพวกเขาพัฒนาวิธี magento2 เห็นได้ชัดว่าพวกเขาไม่ได้เริ่มต้นจาก index.php ที่ว่างเปล่า แต่ใช้รหัสจาก M1 บางส่วน เมื่อคุณดูที่วิธีการแบบจำลองมาตรฐาน ( load(), save()และdelete()) deprecatedทั้งหมดจะถูกทำเครื่องหมายเป็น นี่เป็นเพราะงานนั้นถูกย้ายไปยังที่เก็บข้อมูล (ในบางกรณีพื้นที่เก็บข้อมูลทั้งหมดจะเรียกsave()วิธีแบบจำลองปกตินี้แต่ถนนดูเหมือนชัดเจนสำหรับฉัน)


1
สิ่งที่เกี่ยวกับแบบจำลองข้อมูลผลิตภัณฑ์มีไม่มีรูปแบบข้อมูลผลิตภัณฑ์
sivakumar

2

แบบจำลองแค็ปซูลตรรกะทางธุรกิจอิสระของสตอเรจพวกเขาไม่รู้เกี่ยวกับเอ็นจิ้นฐานข้อมูลหรืออินสแตนซ์ใน Magento 2 Data Models เป็นData Transfer Objects (DTOs) การใช้อินเตอร์เฟส DTO (data model) เฉพาะสำหรับ Magento CRUD model (โมเดล ) กำหนดวิธีการเรียนที่มีอยู่ผ่าน Magento WebAPI

Model/Data/Customer.phpกำหนดว่าจะใช้วิธีการใดสำหรับ API ในขณะที่Model/Customer.phpมีการใช้งานประเภท Magento 1 แบบดั้งเดิมของตัวรับแบบกำหนดเองและตัวตั้งค่าที่พร้อมใช้งานสำหรับการดำเนินการที่ไม่ใช่ API

Model/ResourceModel/CustomerRepository.php เป็นส่วนหนึ่งของฟีเจอร์ใหม่ที่นำเสนอใน Magento 2 - Service Contracts ซึ่งทำงานร่วมกับการรวมกันของ DTO (Data Models)

ดังที่เราทราบว่าวีโอไอพี ORM ประกอบด้วยโมเดลโมเดลทรัพยากรและคอลเลกชันและขึ้นอยู่กับฐานข้อมูลวัตถุประสงค์ของสัญญาการให้บริการคือการซ่อนตรรกะการจัดเก็บเพื่อให้ลูกค้าที่เชื่อมต่อกับ Repository (Service Contract) ไม่สนใจเกี่ยวกับการจัดเก็บเป้าหมาย เครื่องยนต์

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