পরিষেবা চুক্তির চেয়ে $ মডেল-> লোড () পছন্দ করার কোনও কারণ আছে কি?


24

আমি বুঝতে পারি যে Magento 2 এ মডিউলগুলির মধ্যে কাজ করার জন্য পছন্দের উপায়টি পরিষেবার চুক্তি ব্যবহার করছে using

সুতরাং আমি যদি কোনও পণ্য লোড করতে চাই তবে আমি পণ্য সংগ্রহস্থলটি ব্যবহার করি:

$product = $productRepository->getById($id);

যা চুক্তির মাধ্যমে একটি উদাহরণ ফিরে আসে Magento\Catalog\Api\Data\ProductInterface

তবে আমি পরিবর্তে পুরানো উপায়টি ব্যবহার করতে পারি, সরাসরি ডোমেন স্তরটিকে কল করে:

$product = $productFactory->create()->load($id);

এটি প্রয়োজনীয় বা দরকারী হতে পারে এমন কোনও মামলা আছে?

ডেভডোকরা বলেছেন (হাইলাইট যুক্ত):

একটি মডিউল সরাসরি অন্য মডিউলে কল করতে পারে। এই দৃ tight়ভাবে মিলিত সমাধানটি বেশিরভাগ পরিস্থিতিতেই সুপারিশ করা হয় না তবে কখনও কখনও অনিবার্য হয়

[...]

অন্য মডিউলের ডোমেন-স্তর কোডটি কল করার জন্য আপনার কৌশলটি আপনার সিস্টেমের অনন্য কনফিগারেশন এবং প্রয়োজনীয়তার উপর নির্ভরশীল।

সূত্র: http://devdocs.magento.com/guides/v2.0/architecture/archi_persferencess/domain_layer.html

এবং সম্পর্কিত প্রশ্নে একটি মন্তব্য বলা হয়েছে:

সংগ্রহস্থল ব্যবহার করে আপনাকে একটি প্রোডাক্ট ডেটা মডেল ( Api/Data/Product) দেবে, এটি একটি মডেল যা একটি বোবা-ডাউন ডিটিওতে রূপান্তরিত হয়। বিবেচনা করার মতো কিছু কারণ সেগুলি একেবারেই আলাদা

তবে যতদূর আমি দেখতে পাচ্ছি সাধারণ অবস্থার মধ্যে অবজেক্টগুলি একই, কেবল পিএইচপিডোকের ক্ষেত্রে ফেরতের প্রকারগুলি পৃথক ( Magento\Catalog\Api\Data\ProductInterface/ Magento\Catalog\Model\Product)

উত্তর:


23

প্রোডাক্টফেটরির পদ্ধতির পরিবর্তে ProductRepository'গুলি get/ ব্যবহার করার কারণটি getByIdহ'ল load()পূর্ববর্তীটি পরবর্তীকালের চেয়ে উচ্চতর স্তরের।

ProductRepository- ঠিক যেমন ProductFactory- কোনও Product মডেল ফিরে আসতে পারে তবে এম 2 এটি বিবেচনা করতে চায় না । এটা না কি \Magento\Catalog\Api\ProductRepositoryInterface::getById()'র ডক ব্লক বলেছেন। এটি বলছে @return \Magento\Catalog\Api\Data\ProductInterface, এটি একটি ইন্টারফেস যা একটি পণ্য মডেল বাস্তবায়ন করছে।

সুতরাং, যখনই সম্ভব আপনার এপিআই স্তরটি ব্যবহার করা উচিত, কারণ:

  • Api/Data ওয়েব অপি-তেও স্তর ব্যবহার করা হয়
  • মডেলগুলি করতে পারে - এবং সম্ভবত হবে - কোনও সময়ে রিফ্যাক্টর হবে; Api/Data/Productহবে না.
  • আপনার ক্লাসে পণ্য পেতে, আপনাকে একটি কংক্রিট কারখানা ( ProductFactory) বা একটি ইন্টারফেস ( ProductRepository) ইনজেক্ট করতে হবে । আমি মনে করি না আপনি চান আপনার মডিউলটি একটি ইন্টারফেস ছাড়া অন্য কোনও কিছুর উপর নির্ভর করবে। তাই আমি এই ধরণের ইনজেকশনটির সাথে একমত নই ।

ওয়েব এপিআই (আরএসইএসটি, এসওএপি ইত্যাদি) সরবরাহের জন্য আমি মডেলগুলির উপরে এটি অন্য একটি ছোট অ্যাবস্ট্রাকশন স্তর হিসাবে বিবেচনা করি ।

এই উত্তর উদ্ধৃত :

আশা করি, আপনি পরিষেবা চুক্তিগুলি পছন্দ করবেন যখন ম্যাজেন্টো 2 এর পরবর্তী প্রকাশের পরে আপনার কাস্টম মডিউলটি ভেঙে যাবে না (অবশ্যই যদি আপনি পরিষেবা চুক্তিগুলি বাইপাস না করেন এবং সরাসরি মডেল / সংগ্রহ / সংস্থান / মডেল ব্যবহার করেন না)। এবং আপনি যখন ম্যাজেন্টো 2 ওয়েব এপিআই গ্রহণ করা / প্রকাশ করা শুরু করেন যা এখন একই পরিষেবা চুক্তির উপর ভিত্তি করে। সুতরাং আপনাকে কেবলমাত্র এক জায়গায় পরিবর্তন করতে হবে (যেমন প্লাগইনের মাধ্যমে) এবং সেগুলি সর্বত্র প্রয়োগ করা হবে। ম্যাজেন্টো 1 এ এটি অসম্ভব ছিল।


আমি যা চেয়েছিলাম ঠিক তা নয় তবে এটিই আমি ভেবেছিলাম, নিশ্চিতকরণের জন্য ধন্যবাদ!
ফ্যাবিয়ান শেমংলার

1
But I could also use the old way instead, calling the domain layer directly: (use factory). Is there any case where this would be necessary or useful?। হ্যাঁ: যখন আপনাকে কোনও মডেলের পদ্ধতিতে কল করতে হবে এবং এটির কোনও নয় Api/Data/Product। ইহা কি ভাল? :)
নেভভারমাইন্ড

হ্যাঁ, এটি উপলব্ধি করে :)
ফ্যাবিয়ান শেমংলার

14

আমার কাছে, loadপদ্ধতিটি getById/ getপদ্ধতিতে ব্যবহার করার কোনও কারণ নেই ।

আমি বলি না যে আমি ঠিকই আছি তবে আমি কীভাবে জিনিসগুলি দেখি তা এখানে।

ঠিক আছে সুতরাং getByIdপদ্ধতিটি এখানে ( getপদ্ধতিটি একই তবে আইডির পরিবর্তে স্কু ব্যবহার করে):

public function getById($productId, $editMode = false, $storeId = null, $forceReload = false)
{
    $cacheKey = $this->getCacheKey(func_get_args());
    if (!isset($this->instancesById[$productId][$cacheKey]) || $forceReload) {
        $product = $this->productFactory->create();
        if ($editMode) {
            $product->setData('_edit_mode', true);
        }
        if ($storeId !== null) {
            $product->setData('store_id', $storeId);
        }
        $product->load($productId);
        if (!$product->getId()) {
            throw new NoSuchEntityException(__('Requested product doesn\'t exist'));
        }
        $this->instancesById[$productId][$cacheKey] = $product;
        $this->instances[$product->getSku()][$cacheKey] = $product;
    }
    return $this->instancesById[$productId][$cacheKey];
}

আপনি যে কোডটি পেস্ট করেছেন তা লক্ষ্য করতে পারেন:

$productFactory->create()->load($id);

এই ফাংশনের অংশ।

তবে আপনি যদি একই আইডির জন্য getByIdবা getপদ্ধতিটি পূর্বে ব্যবহার করেছেন (বা getপদ্ধতির ক্ষেত্রে স্কু ) তবে অতিরিক্ত শর্তটি অতিরিক্ত পুনরায় লোড এড়াতে ক্যাশেড দৃষ্টান্তগুলি ব্যবহার করে

আপনি ভাবতে পারেন যে ব্যবহার করার একটি ভাল কারণ loadহ'ল সেই ক্যাশেড দৃষ্টান্তগুলি ব্যবহার করা এড়ানো (কোনও ক্ষেত্রে এটি একটি ভাল কারণ হতে পারে? যা আমি জানি না) তবে getByIdএবং getপদ্ধতিগুলির একটি $forceReloadপরামিতি রয়েছে যা সত্যতে সেট করা যেতে পারে এই ক্যাশে দৃষ্টান্তগুলি ব্যবহার করা এড়িয়ে চলুন।

এ কারণেই আমার কাছে loadপদ্ধতি getByIdবা getপদ্ধতিগুলি ব্যবহার করার কোনও ভাল কারণ নেই ।


2

সংগ্রহস্থল এবং সংগ্রহের মধ্যে পার্থক্য বুঝতে দয়া করে।

আপনার উদাহরণে, সংগ্রহস্থলগুলি ব্যবহার করে, আপনি এর একটি অ্যারে পাবেন Magento\Catalog\Api\Data\ProductInterfaceসংগ্রহ সংগ্রহ থেকে আলাদা Magento\Catalog\Model\Product

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

আশা করি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.