Trước tiên chúng ta hãy xem, điều gì xảy ra nếu bạn sử dụng save()
phương thức trực tiếp trên một product
mô hình như
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
Bản thân lớp mô hình là
Magento\Catalog\Model\Product
Trong lớp này, tìm kiếm định nghĩa của phương thức save ().
Không tìm thấy đúng không? Chà, có beforeSave () và afterSave (), nhưng không lưu () chính nó. Thú vị không?
Sau đó, chúng ta cần xem xét các lớp cha của Magento\Catalog\Model\Product
.
Chúng ta cần phải đi qua Magento\Catalog\Model\AbstractModel
và Magento\Framework\Model\AbstractExtensibleModel
, cuối cùng cũng đến nơi Magento\Framework\Model\AbstractModel
.
Chắc chắn, có một phương thức save () ở đây và nó trông giống như
public function save()
{
$this->_getResource()->save($this);
return $this;
}
Bây giờ chúng ta thấy, bất cứ khi nào save () được gọi trên bất kỳ mô hình nào, phương thức save () từ phương thức này AbstractModel
được gọi và thực hiện là MODEL TÀI NGUYÊN thực sự thực hiện việc lưu.
Điều cuối cùng này không có gì đáng ngạc nhiên khi chúng ta luôn luôn, vì giống như từ sự cầu xin thời gian trong Magento 1.0, tạo ra cả Mô hình và mô hình Tài nguyên cho bất kỳ thực thể nào.
Bây giờ, hãy xem cách làm ProductRepository
việc.
Cho phép mở tập tin
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
Giao diện này yêu cầu có một phương thức save (), trong số các phương thức khác.
Ai đang thực sự thực hiện giao diện này?
Cho phép mở tập tin
/etc/di.xml
và kiểm tra dòng 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Vì vậy, một cách tự nhiên, chúng tôi tìm thấy ý nghĩa của ẩn ()
/vendor/magento/module-catalog/Model/ProductRepository
và nó bắt đầu trên dòng 444, trông giống như
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
Phương thức này mong đợi một đối tượng sản phẩm $ thuộc loại \Magento\Catalog\Api\Data\ProductInterface
được thông qua, nhưng theo mặc định, điều này giải quyết Magento\Catalog\Model\Product
.
Nhìn xuống bên dưới dòng 500, với một try
tuyên bố, chúng ta thấy một cái gì đó như
$this->resourceModel->save($product);
Bạn đoán đúng rồi! $this->resourceModel
là loại \Magento\Catalog\Model\ResourceModel\Product
, được khai báo là protected
tài sản trên dòng 77.
Vì vậy, một lần nữa, ResourceModel
thực sự làm tiết kiệm.
Nhưng, giữa dòng 444 và 500 thực sự là câu trả lời cho câu hỏi của bạn. Tất cả các mã được thực thi ở đây, thực sự, cuối cùng có thể và sẽ dẫn đến sự khác biệt trong hành vi giữa lưu mô hình trực tiếp và cách lưu trữ kho lưu trữ này.
Ví dụ: kho sản phẩm sẽ nhận và xử lý các liên kết sản phẩm nếu ignore_links_flag
được đặt thành 0
, kiểm tra xem đây có phải là sản phẩm hiện có ở nơi đầu tiên không, v.v.
Có lẽ chúng ta cần kết luận rằng nếu có bất kỳ nhu cầu nào trong tương lai để thay đổi cách lưu sản phẩm, có lẽ cách tốt hơn để làm điều đó là ghi đè lên kho lưu trữ sản phẩm thay vì mô hình sản phẩm.
Cũng vậy với việc tiết kiệm và cập nhật sản phẩm. Tôi muốn sử dụng các đối tượng kho lưu trữ sản phẩm.
Tôi cũng vui lòng giới thiệu bạn đến /vendor/magento/module-cms/Model/PageRepousing.php
Đây là cách một trang CMS sẽ được lưu thông qua kho lưu trữ. Ở đây, mọi thứ đơn giản hơn. Id cửa hàng được đặt và mô hình tài nguyên được gọi để lưu ngay lập tức.
Với thông báo cuối cùng này, bạn sẽ kết luận rằng trong một số trường hợp, có thể không có nhiều sự khác biệt giữa kho lưu trữ và mô hình lưu, nhưng dù sao tôi hy vọng bạn được trang bị ngay bây giờ để phát hiện ra chúng bất cứ khi nào bạn cần làm như vậy.