ให้เราดูก่อนว่าจะเกิดอะไรขึ้นถ้าคุณใช้save()
วิธีนี้กับproduct
โมเดลโดยตรง
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
คลาสโมเดลนั้นคือ
Magento\Catalog\Model\Product
ภายในคลาสนี้ค้นหานิยามของเมธอด save ()
ไม่พบที่ถูกต้อง? มันมี beforeSave () และ afterSave () แต่ไม่ใช่ save () น่าสนใจใช่ไหม
Magento\Catalog\Model\Product
จากนั้นเราจะต้องมองไปที่ชั้นเรียนของผู้ปกครอง
เราจำเป็นต้องผ่านMagento\Catalog\Model\AbstractModel
และเพียงเพื่อในที่สุดก็มาถึงที่Magento\Framework\Model\AbstractExtensibleModel
Magento\Framework\Model\AbstractModel
แน่นอนว่ามีวิธีการบันทึก () ที่นี่และดูเหมือนว่า
public function save()
{
$this->_getResource()->save($this);
return $this;
}
เราเห็นแล้วว่าเมื่อใดก็ตามที่ save () ถูกเรียกใช้ในโมเดลใด ๆ เมธอด save () จากสิ่งนี้AbstractModel
จะถูกเรียกใช้และการใช้งานก็คือการที่ RESOURCE MODEL จะทำการบันทึกจริง
อันสุดท้ายนี้ไม่น่าแปลกใจเลยที่เราอยู่ตลอดเวลาเนื่องจากชอบจากการขอเวลาใน Magento 1.0 การสร้างทั้งแบบจำลองและแบบจำลองทรัพยากรสำหรับทุกหน่วยงาน
ทีนี้มาดูวิธีการProductRepository
ทำงานกันดีกว่า
ให้เปิดไฟล์
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
อินเตอร์เฟสนี้ต้องการให้มีวิธีการบันทึก () ระหว่างวิธีอื่น ๆ
ใครใช้อินเทอร์เฟซนี้จริง ๆ
ให้เปิดไฟล์
/etc/di.xml
และตรวจสอบบรรทัดที่ 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
ดังนั้นโดยธรรมชาติแล้วเราพบว่าการฝังของ the save () menthod ภายใน
/vendor/magento/module-catalog/Model/ProductRepository
และมันเริ่มต้นที่บรรทัด 444 มองคล้าย
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
วิธีการนี้คาดว่าจะมีวัตถุ $ สินค้าประเภท\Magento\Catalog\Api\Data\ProductInterface
ผ่านไป Magento\Catalog\Model\Product
แต่โดยค่าเริ่มต้นแก้ไขนี้
มองลงไปด้านล่างของบรรทัด 500 ชนะtry
คำสั่งเราเห็นอะไรบางอย่าง
$this->resourceModel->save($product);
คุณเดาได้ดี! $this->resourceModel
เป็นประเภท\Magento\Catalog\Model\ResourceModel\Product
ประกาศเป็นprotected
ทรัพย์สินในบรรทัด 77
ดังนั้นอีกครั้งResourceModel
การประหยัดจริง
แต่ระหว่างบรรทัด 444 ถึง 500 เป็นคำตอบสำหรับคำถามของคุณ รหัสทั้งหมดที่ดำเนินการที่นี่ในที่สุดอาจและจะนำไปสู่ความแตกต่างในพฤติกรรมระหว่างการบันทึกแบบจำลองโดยตรงและวิธีการบันทึกที่เก็บนี้
ตัวอย่างเช่นพื้นที่เก็บข้อมูลผลิตภัณฑ์จะได้รับและประมวลผลลิงก์ผลิตภัณฑ์หากignore_links_flag
มีการตั้งค่าเป็น0
ตรวจสอบว่าเป็นผลิตภัณฑ์ที่มีอยู่ในสถานที่แรก ฯลฯ
เราอาจจำเป็นต้องสรุปว่าหากความต้องการใด ๆ ในอนาคตเพื่อเปลี่ยนวิธีการบันทึกผลิตภัณฑ์อาจเป็นวิธีที่ดีกว่าในการทำเช่นนั้นโดยการแทนที่ที่เก็บผลิตภัณฑ์แทนรุ่นผลิตภัณฑ์
เช่นเดียวกันกับการบันทึกและอัปเดตผลิตภัณฑ์ ฉันควรใช้วัตถุที่เก็บผลิตภัณฑ์
ฉันยังกรุณาอ้างอิงถึงคุณ /vendor/magento/module-cms/Model/PageRepository.php
นี่คือวิธีที่หน้า CMS จะถูกบันทึกผ่านพื้นที่เก็บข้อมูล ที่นี่สิ่งต่าง ๆ ง่ายขึ้น รหัสร้านค้ามีการตั้งค่าและเรียกใช้โมเดลทรัพยากรเพื่อบันทึกทันที
ด้วยการแจ้งเตือนครั้งสุดท้ายนี้คุณจะสรุปได้ว่าในบางกรณีอาจมีความแตกต่างไม่มากนักระหว่างที่เก็บข้อมูลและแบบจำลอง แต่ฉันหวังว่าคุณจะพร้อมที่จะสังเกตเห็นเมื่อใดก็ตามที่คุณต้องการ