ম্যাজেন্টো 2 এ কখন আমাদের একটি সংগ্রহশালা এবং কারখানা ব্যবহার করা উচিত?


74

আমি ম্যাজেন্টো 2 তে কয়েকটি টিউটোরিয়াল দিয়েছি এবং এটি আমাকে কিছুটা বিভ্রান্ত করে। আমি দেখতে পাচ্ছি যে মূলত দুটি উপায় রয়েছে যার মাধ্যমে আমরা ব্যবসায়িক প্রতিষ্ঠানগুলি পড়তে / লিখতে পারি:

তথ্য উদ্ধার

কারখানার পদ্ধতির ব্যবহার

$object = $this->myFactory->create();
$object->load($myId);

একটি সংগ্রহস্থল পদ্ধতির ব্যবহার

$repo   = $this->myRepository();
$object = $repo->getById($myId);

তথ্য সংরক্ষণ

কারখানার পদ্ধতির ব্যবহার

$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();

একটি সংগ্রহস্থল পদ্ধতির ব্যবহার

$repo   = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);

আমি আরও দেখতে পাচ্ছি, নির্ভরতা ইঞ্জেকশন ব্যবহার করে একটি সংগ্রহস্থল এবং কারখানার শ্রেণি উভয়ই ইনজেকশনের ব্যবস্থা করতে পারে। এটি আমার পক্ষে অন্তত বিভ্রান্তিকর।

আমাদের কখন একটি সংগ্রহস্থল পদ্ধতির এবং কারখানার পদ্ধতির ব্যবহার করা উচিত? আমাদের সেরা অনুশীলন অনুসরণ করা উচিত?


কারখানা, সংগ্রহশালা এবং সংগ্রহশালা ব্যবহারের একটি ভাল উদাহরণ \ ম্যাজেন্টো \ সেটআপ \ ফিক্সচারগুলি \ বিভাগের
রিসোলভার

উত্তর:


71

যদি কোনও সংগ্রহস্থল থাকে এবং এটি আপনার ভাল যা প্রয়োজন তা করে, সর্বদা সংগ্রহস্থলটিকে পছন্দ করুন।

সংগ্রহস্থলগুলি পরিষেবা চুক্তির অংশ (এগুলি ইন্টারফেসের প্রয়োগকরণ Api), এর অর্থ তারা অন্য মডিউলগুলির সর্বজনীন ইন্টারফেস হিসাবে বোঝানো হয়।

সম্পূর্ণ লোডিংয়ের জন্য সংগ্রহস্থলগুলি ব্যবহার করুন

$model->load()পরিষেবা চুক্তির অংশ নয়। সেই বিশেষ বিষয়ে আমার একটি প্রশ্ন ছিল, আপনি উত্তরগুলি দরকারী দেখতে পাবেন: পরিষেবা চুক্তির চেয়ে $ মডেল-> লোড () পছন্দ করার কোনও কারণ আছে কি?

নতুন সত্তা তৈরি করতে কারখানাগুলি ব্যবহার করুন

সংগ্রহস্থলগুলি কোনও নতুন সত্তা তৈরির পদ্ধতিগুলির সাথে আসে না, সুতরাং সেই ক্ষেত্রে আপনার একটি কারখানার প্রয়োজন হবে। তবে ইন্টারফেসের জন্য কারখানাটি ব্যবহার করুন , যেমন Magento\Catalog\Api\Data\ProductInterfaceFactory- এটি ডিআই কনফিগারেশনের উপর ভিত্তি করে সঠিক বাস্তবায়ন তৈরি করবে।

তারপরে repository->save()সেভ করতে মেথডটি ব্যবহার করুন ।

আপনার আরও নিয়ন্ত্রণের প্রয়োজন হলে সংগ্রহের কারখানাগুলি ব্যবহার করুন

নিম্নলিখিতটি অফিসিয়াল ম্যাজেন্টো সেরা অনুশীলন নয়, তবে বর্তমানে, সংগ্রহাগুলি আপনাকে কী লোড করতে হবে তার উপর সূক্ষ্ম নিয়ন্ত্রণ দেয় না। অনুসন্ধানের মানদণ্ড API আপনাকে ফিল্টারগুলি সংজ্ঞায়িত করতে দেয়, তবে উদাহরণস্বরূপ, নির্দিষ্ট EAV বৈশিষ্ট্যগুলি বেছে নেওয়ার বা কোন সূচক টেবিলগুলিতে যোগদান করতে হবে তা নির্দিষ্ট করার কোনও উপায় নেই।

এগুলি হ'ল বাস্তবায়নের বিশদ, পরিষেবা চুক্তি এপিআই থেকে লুকানো, তবে প্রায়শই এই বাস্তবায়ন বিশদগুলি গুরুত্ব দেয় এবং আপনি যদি এড়িয়ে যান তবে আপনি খারাপ অভিনয় পাবেন। সেই কারণে, সংগ্রহস্থলগুলি আমাকে সীমাবদ্ধ করার সাথে সাথে আমি অন্তর্নিহিত সংগ্রহগুলি ব্যবহার করতে আর দ্বিধা বোধ করি না।


2
নতুন সত্তা তৈরি করতে কারখানাগুলি ব্যবহার সম্পর্কে একটি কোড উদাহরণ দিতে পারেন , ব্যাখ্যাটি কিছু বিবরণ মিস করে এবং বুঝতে অসুবিধা হয়। আপনাকে অনেক ধন্যবাদ.
কী শ্যাং


ধন্যবাদ। তবে মূল use the factory for the interface, such as Magento\Catalog\Api\Data\ProductInterfaceFactory - it will create the right implementation based on DI configuration.বিষয়টি যা আমি বুঝতে পারি না, দেব গাইডগুলি ইন্টারফেসফ্যাক্টরি প্রবর্তন করে না , repository->save()নতুন সত্তাগুলি সংরক্ষণ করার পদ্ধতিটি কীভাবে ব্যবহার করবেন ? আমি কেবল নতুন সত্ত্বা সংরক্ষণের জন্য কারখানাটি ব্যবহার করতে পারি, সংগ্রহস্থল নয়।
কী শ্যাং

@ কে শ্যাং, এর অর্থ হ'ল ইন্টারফেস আপনাকে টেবিলের প্রতিটি কলাম সংরক্ষণ করার জন্য সমস্ত সেট ডেটা ফাংশন দেবে তাই নতুন রেকর্ডগুলি সংরক্ষণ করার জন্য যেখানেই সম্ভব ইন্টারফেসটি ব্যবহার করার চেষ্টা করুন। ইন্টারফেসফ্যাক্টরি ক্লাসগুলি ডি এর অংশ হিসাবে তৈরি হয়েছে: সংকলন করুন যাতে আপনি সেগুলি var / প্রজন্মের ফোল্ডারে দেখতে পারেন।
স্টিভেনসাগার

@ স্টিভেনসাগার ধন্যবাদ, আমি এখন এটি বুঝতে পারি।
কী শ্যাং

21

ভাল প্রশ্ন.

এমনকি যদি সংগ্রহশালা এবং কারখানাগুলি উভয়ই আমাদের সত্তা অ্যাক্সেস করতে দেয় তবে আমি মনে করি আমাদের তাদের দায়িত্বের দিকে মনোনিবেশ করা উচিত ।

ম্যাজেন্টো ডকুমেন্টেশন থেকে : "ফ্যাক্টরিগুলি হ'ল পরিষেবা ক্লাস যা ইনজেকশনযোগ্য ক্লাসগুলি ইনস্ট্যান্ট করে দেয়, অর্থাত্ এমন মডেলগুলি যা একটি ডাটাবেস সত্তাকে উপস্থাপন করে They

অ্যালান স্টর্মের নিবন্ধ থেকে : "একটি সংগ্রহস্থল অবজেক্ট আপনার অবজেক্টের তথ্য কোনও অবজেক্ট স্টোরে পড়ার এবং লেখার জন্য দায়বদ্ধ"

আমার ব্যাখ্যাটি হ'ল: যদি আমাদের উদ্দেশ্য অ-ইনজেক্টেবল (তথাকথিত "নতুন") হিসাবে কাজ করা হয় তবে আমাদের কারখানাগুলি ব্যবহার করা উচিত; যদি আমাদের ফোকাস কোনও অবজেক্ট স্টোরের মধ্যে অবজেক্টগুলি অনুসন্ধান / পড়ার / লেখার দিকে থাকে তবে আমাদের উচিত সংগ্রহশালা ব্যবহার করা।

বিষয়টিতে এটি আমার আদর্শবাদী দৃষ্টিভঙ্গি; অ্যালান দ্বারা নির্দেশিত হিসাবে, আসল বাস্তবায়ন আমাদের জিনিসগুলি জগাখিচুড়ি করতে বাধ্য করতে পারে তা মনে রাখবেন।

উপভোগ করুন।


5

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

এ সম্পর্কে অ্যালান স্টর্মের একটি খুব বিস্তারিত নিবন্ধ লেখা আছে, কীভাবে কীভাবে সংগ্রহাগুলি ব্যবহার করতে হবে তা ব্যাখ্যা করার পাশাপাশি এই নতুন পদ্ধতির কিছু ত্রুটিগুলিও খতিয়ে দেখছেন: http://alanstorm.com/magento_2_ বোঝার_বজেক্ট_রেপোসিটিরিজ /

এছাড়াও, ম্যাজেন্টো ডকুমেন্টেশন থেকে, এই নতুন এপ্রোচটির সুবিধাগুলি ব্যাখ্যা করে: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.html


2
উত্তরের জন্য ধন্যবাদ. অ্যালানস্টর্মের নিবন্ধটি আমি নিজে থেকে আমার মাথায় এই সন্দেহটি পাই। :)
রাজীব কে তোমি

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

আমি আপনার মন্তব্যের সাথে 100% একমত আমি সত্যিই আশা করছি. এছাড়াও দয়া করে ফ্যাবিয়ের উত্তরও দেখুন।
রাজীব কে তোমি

হ্যাঁ, আমি দেখেছি :) ইতিমধ্যে তার উত্তরটি upvated। মহান প্রশ্নের জন্য ধন্যবাদ!
মেরিনা ভিলিসা

আরও আমি কোথাও পড়েছি যে নিম্ন স্তরের ডেটা ম্যানিপুলেশন পদ্ধতিটি ইনস্টল / আপগ্রেড স্ক্রিপ্ট $setup->updateTableRow(...);বা কারখানাগুলিতে ঠিক আছে , আমি নিশ্চিত নই তবে উচ্চতর স্তরের ব্যবহারের পক্ষে যুক্তিগুলি সেই অঞ্চলে প্রযোজ্য বলে মনে হয়, আপনি কী ভাবেন?
মেডেমেক

1

আশা করি এই উত্তরটি অন্যান্য এক্সটেনশান বিকাশকারীদেরও সহায়তা করতে পারে।

আমাদের কেবলমাত্র সংগ্রহস্থল ব্যবহার করে মডেল সংরক্ষণ করতে হবে।

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

  4. মডেলটির লোড লোড করার জন্য, getById () পদ্ধতিটি ব্যবহার করে মডেল পাওয়ার সবচেয়ে ভাল বিকল্প it

আমি মডেল সংরক্ষণের উদ্দেশ্যে বিশেষত যতটা সম্ভব সংগ্রহস্থল ব্যবহার করার পরামর্শ দেব।


1

এখন লোড, সেভ, মুছে ফেলার পদ্ধতিগুলি (মডেলগুলি) অবনতিযুক্ত are সুতরাং আমরা সংস্থান মডেল বা সংগ্রহশালা ব্যবহার করতে পারি।

সংরক্ষণ করুন, মুছুন, লোড অপারেশনগুলির জন্য সত্তা ব্যবস্থাপক ধারণাটি এখন ম্যাগেন্তো ব্যবহার করছেন।

এই অপারেশনগুলি সম্পাদন করতে রিসোর্স মডেলগুলির সত্তা পরিচালক রয়েছে manager

$categoryModel = $this->_objectManager->create('\Magento\Catalog\Model\CategoryFactory')->create();        
  $categoryResource = $this->_objectManager->create('\Magento\Catalog\Model\ResourceModel\Category');        
  $categoryResource->load($categoryModel, 3);        
  echo $categoryModel->getName();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.