মডেলগুলির নতুন বা আপডেট হওয়া সত্ত্বাগুলি কীভাবে সংরক্ষণ করব?


10

ম্যাজেন্টো 2-এ আমাদের সংগ্রহশালা রয়েছে। save()ম্যাজেন্টো ১.৯-এ ভারী ব্যবহৃত ক্লাসিক পদ্ধতিটি 2.04 বা 2.05 থেকে অবধি নিখুঁত হয় if আমি নতুন অবজেক্ট তৈরি করতে এবং নতুন বৈশিষ্ট্য নির্ধারণের পরে কারখানাগুলি ব্যবহার করছিলাম, উদাহরণস্বরূপ যে পণ্যটি আমি কল করেছি save():

$productFactory->create()->setName()...->save()

অন্যদিকে আমাদের কাছে পদ্ধতি রয়েছে এমন সংগ্রহস্থলও রয়েছে save। আমি এটি সংক্ষেপে এটি ব্যবহার করছি:

$product = $productFactory->create()->setName()... $productRepository->save($product)

আমার কোডে আমার উভয় উপায়ে কাজ করার ক্লাস রয়েছে। আমি আরও লক্ষ্য করেছি যে মাঝে মাঝে বিভিন্ন উপায়ে ভিন্ন আচরণের অর্থ হয়। ভান্ডারগুলির সাথে কি ডেটার কিছু অতিরিক্ত বৈধতা সরবরাহ করা হয়েছে?

আমার কোন উপায়ে এটি করা উচিত?

উত্তর:


10

আমাদের প্রথমে দেখতে দিন, আপনি যদি save()কোনও productমডেলটিতে সরাসরি পদ্ধতিটি ব্যবহার করেন তবে কী হয়

/**
 * @var Magento\Catalog\Model\Product $product
 */
$product->save();

মডেল ক্লাস নিজেই

Magento\Catalog\Model\Product

এই শ্রেণীর মধ্যে, সংরক্ষণ () পদ্ধতির সংজ্ঞাটি অনুসন্ধান করুন।

কিছুই ঠিক পাওয়া যায় নি? ঠিক আছে, সেভের আগে () এবং আফটার সেভ () আছে, তবে নিজেই সংরক্ষণ করুন না। আকর্ষণীয়, না?

তারপরে, আমাদের পিতামাতার ক্লাসগুলির দিকে নজর দেওয়া দরকার Magento\Catalog\Model\Product

আমাদের শেষ পর্যন্ত পৌঁছাতে হবে Magento\Catalog\Model\AbstractModelএবং এর মধ্য দিয়ে যেতে হবে ।Magento\Framework\Model\AbstractExtensibleModelMagento\Framework\Model\AbstractModel

নিশ্চিতভাবেই, এখানে একটি সংরক্ষণ () পদ্ধতি রয়েছে এবং এটি দেখতে দেখতে কিছুটা অসাধারণ

public function save()
{
    $this->_getResource()->save($this);
    return $this;
}

আমরা এখন দেখতে পাচ্ছি, যখনই যেকোন মডেলে সেভ () কে ডাকা হয়, এ থেকে সেভ () পদ্ধতিটি কল করা AbstractModelহয় এবং বাস্তবায়ন হ'ল রিসোর্স মডেল আসলে সংরক্ষণ করে।

এই সর্বশেষটি অবাক করে দেওয়ার মতো নয় যে আমরা সর্বদা আছি, যেহেতু ম্যাজেন্টো 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" />

সুতরাং, স্বাভাবিকভাবেই আমরা সেভ () মেন্টহোডের অভ্যন্তরটি খুঁজে পেয়েছি

/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 ....

এই পদ্ধতিটি প্রত্যাশা করে যে কোনও ধরণের object পণ্য অবজেক্ট প্রকারটি \Magento\Catalog\Api\Data\ProductInterfaceকেটে গেছে, কিন্তু ডিফল্টরূপে এটি পুনরায় সমাধান হয় Magento\Catalog\Model\Product

নীচে 500 লাইনে নীচে তাকানো, একটি tryবিবৃতি winthin , আমরা এরকম কিছু দেখতে

$this->resourceModel->save($product);

আপনি ভাল অনুমান! $this->resourceModeltype 77 লাইনে সম্পত্তি \Magento\Catalog\Model\ResourceModel\Productহিসাবে ঘোষিত হয় declaredprotected

সুতরাং, আবার, ResourceModelআসলে সংরক্ষণ করে।

তবে, ৪৪৪ থেকে ৫০০ লাইনের মধ্যেই আপনার প্রশ্নের উত্তর। এখানে কার্যকর করা সমস্ত কোড, প্রকৃতপক্ষে, অবশেষে সরাসরি মডেল সংরক্ষণ এবং সংরক্ষণের এই সংগ্রহস্থলের মধ্যে আচরণের পার্থক্যের কারণ হতে পারে।

উদাহরণস্বরূপ, পণ্য সংগ্রহস্থলটি যদি ignore_links_flagসেট করা থাকে তবে পণ্য লিঙ্কগুলি প্রসেস করবে 0এবং এটি প্রথম স্থানে বিদ্যমান পণ্য কিনা তা পরীক্ষা করে দেখুন etc.

আমাদের সম্ভবত উপসংহারে আসা দরকার যে ভবিষ্যতে যদি পণ্যটি কীভাবে সংরক্ষণ করা হয় তার পরিবর্তন করার প্রয়োজন হয় তবে এটি করার আরও ভাল উপায় হ'ল পণ্য মডেলের পরিবর্তে পণ্য সংগ্রহস্থলকে ওভাররাইড করে।

পণ্য সংরক্ষণ এবং আপডেট করার ক্ষেত্রে এটি একই রকম। আমি বরং পণ্য সংগ্রহস্থল অবজেক্টটি ব্যবহার করব।

আমি আপনাকে বিনীতভাবে / ভেন্ডর / মেমেন্টো / মডুল- সিএমএস / মডেল / পেজরেপোজিটরি.পিএফ-কে উল্লেখ করি

এভাবেই কোনও সিএমএস পৃষ্ঠা সংরক্ষণাগারের মাধ্যমে সংরক্ষণ করা হবে। এখানে বিষয়গুলি সহজ। স্টোর আইডি সেট করা আছে এবং এখনই সংরক্ষণের জন্য রিসোর্স মডেলকে ডাকা হবে।

এই শেষ নোটিশের সাথে, আপনি এই সিদ্ধান্তে পৌঁছে যাবেন যে কোনও কোনও ক্ষেত্রে, সংগ্রহস্থল এবং মডেল সেভের মধ্যে এতটা পার্থক্য নাও হতে পারে তবে যাইহোক আমি আশা করি যে আপনি যখনই এটি করার দরকার হবে তখন সেগুলি সজ্জিত করার জন্য আপনি এখন সজ্জিত হয়েছেন।


1

এটি \Magento\Catalog\Api\Data\ProductInterfaceসরাসরি মডেলের পরিবর্তে ডেটা ইন্টারফেস (উদাহরণস্বরূপ ) ব্যবহার করতে এবং মডেলগুলি লোড ও সেভ করার জন্য সংগ্রহস্থলগুলি ব্যবহার করতে উত্সাহিত করা হয় ।

ম্যাজেন্টো বিকাশকারী ডকুমেন্টেশন দেখুন


1
ঠিক আছে - এটি পুরো সত্তার জন্য সঠিক উপায় - তবে কেবল কিছু বৈশিষ্ট্যের মান আপডেট করার জন্য - আমি মনে করি পুরো সত্তা লোড / সঞ্চয় করার প্রস্তাব দেওয়া হয় না।
বার্তোসক কুবিকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.