ম্যাজেন্টো 2 এ একটি কাস্টম মডেল লোড করার সর্বোত্তম উপায়


15

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

সম্পাদনা: ... এবং আমি জানতে পারি যে আমি কিছু দিক থেকে ভুল ছিল। রাফেলের উত্তরগুলি আমাকে আরও বুঝতে সাহায্য করার পরে আমি মূল পোস্টটি আপডেট করেছি। তাকে ধন্যবাদ!

ধারণাটি নীচে ব্যবহার করা হয়েছে :

আপনি যদি এই ধারণাগুলিতে স্বাচ্ছন্দ্য বোধ করেন তবে নীচের কোডগুলি এবং ব্যাখ্যাগুলি বোঝা আপনার পক্ষে সহজ হবে:

  • ইনজেকশন নির্ভরতা ( $this->variableকোডগুলিতে প্রতিটি ভেরিয়েবল ইনজেক্ট করা হয়)
  • পরিষেবা চুক্তি এবং সংগ্রহস্থল
  • কারখানা

প্রসঙ্গ :

কেবল আরও প্রসঙ্গ থাকতে, কল্পনা করুন যে আমাদের সাথে একটি মডিউল সঠিকভাবে তৈরি করা হয়েছে:

  • একটি ব্লক শ্রেণীর কাস্টমব্লক একটি পদ্ধতি রয়েছে getCustomModel($id),
  • এই পদ্ধতিটি প্যারামে পাস করা আইডির ভিত্তিতে একটি কাস্টমমডেল অবজেক্ট প্রদান করে,
  • কাস্টমমোডেল প্রকারটি মডেলটির সাথে সামঞ্জস্য \Vendor\Module\Model\CustomModel
  • এই মডেলটি তার সংস্থান মডেল নিয়ে আসে (ইন \Vendor\Module\Model\ResourceModel\CustomModel)
  • এবং এর সংগ্রহস্থল সহ (ইন \Vendor\Module\Model\CustomModelRepository)।

প্রশ্ন :

  • কাস্টমমডেল অবজেক্টটি লোড করে সমস্ত জিনিসকে দেওয়ার জন্য সর্বোত্তম অনুশীলন কোনটি?

load()এই পদ্ধতিটি অবচিত হওয়ায় আপনি কাস্টমমডেল অবজেক্টটি ব্যবহার করতে পারবেন না ।

ভাল অনুশীলনটি বলে যে আপনাকে কাস্টমমডেল পরিষেবা চুক্তিটি ব্যবহার করতে হবে। পরিষেবাদি চুক্তিগুলি হ'ল ডেটা ইন্টারফেস (যেমন কাস্টমমডেলআইন্টারফেস) এবং পরিষেবা ইন্টারফেস (যেমন কাস্টমমডেলরোপোসিটারি ইন্টারফেস)। সুতরাং আমার ব্লকটি দেখতে এমন দেখাচ্ছে:

/ ** @vvv স্লাইডআরপোসিটোরি ইন্টারফেস * /
সুরক্ষিত ide slideRepository;

/ **
 * কাস্টমব্লক নির্মাণকারী
 * ...
 * @ পরিমাপ কাস্টমমোডেলরোপোসিটোরি ইন্টারফেস। কাস্টমমোডেলরোপোসিটোরি
 * ...
 * /
পাবলিক ফাংশন __ কনস্ট্রাক্ট (
...
কাস্টমমোডেলরোপোসিটোরি ইন্টারফেস $ কাস্টমমোডেলরোপোসিটোরি
...
) {
    $ এটি-> কাস্টমমোডেলরোপোসিটিরি = $ কাস্টমমোডেলরোপোসিটিরি;
}

পাবলিক ফাংশন getCustomModel ($ আইডি) {
    ফিরুন $ এটি-> কাস্টমমোডেলরোপোসিটোরি-> পান ($ আইডি);
}

প্রথমত, আমরা CustomModelRepositoryInterfaceকন্সট্রাক্টরটিতে অবজেক্টটি ইনজেক্ট করি এবং আমরা আমাদের getCustomModel()পদ্ধতিতে এটি ব্যবহার করি ।

ক্লাসে Api\CustomModelRepositoryInterfaceখুব একটা হয় না। সাধারণত (কিন্তু কিছুই রোধ আপনি ভিন্নভাবে করতে) আপনি মৌলিক পদ্ধতি বর্ণনা করবে, get, getList, save, delete, deleteById। এই বিষয়টির উদ্দেশ্যে, নীচে কেবলমাত্র getপদ্ধতি ঘোষণা:

/**
 * Get info by id
 *
 * @param int $id
 * @return Data\CustomModelInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 */
public function get($id);

ঠিক আছে, তবে যদি আমার কাস্টমমডেল ইন্টারফেসটি আমার ব্লক কনস্ট্রাক্টরে নির্ভরতা ইনজেকশন দ্বারা কল করা হয়, কোডটি কোথায়? এই প্রশ্নের উত্তরের জন্য আপনাকে ম্যাজেন্টোকে ব্যাখ্যা করতে হবে যেখানে এই ইন্টারফেসটি প্রয়োগকারী শ্রেণিটি খুঁজে পাবে। মডিউলটির etc / di.xML ফাইলটিতে আপনাকে যুক্ত করতে হবে:

<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />

সুতরাং CustomModelRepositoryInterfaceক্লাস একটি পরিষেবা ইন্টারফেস। এটি বাস্তবায়নের ক্ষেত্রে আপনাকে ডেটা ইন্টারফেসও প্রয়োগ করতে হবে (কমপক্ষে Vendor\Module\Api\Data\CustomModelInterfaceএবং Vendor\Module\Api\Data\CustomModelSearchResultsInterface)। আপনার মডেলটিকে আপনার প্রতিটি ইন্টারফেসের জন্য লাইন প্রয়োগ করতে হবে Vendor\Module\Api\Data\CustomModelInterfaceএবং যুক্ত করতে হবে <preference ... />। অবশেষে যে কোনো সময় আপনি পরিষেবা চুক্তি ব্যবহার করেন, মনে mySomethingInterfaceআর না এ mySomething: ব্যবহার Magento দিন di.xmlপছন্দগুলি প্রক্রিয়া।

ঠিক আছে, এরপরে কী আসে? CustomModelRepositoryInterfaceব্লক কনস্ট্রাক্টর ইনজেক্ট করার সাথে সাথে আমরা একটি CustomModelRepositoryঅবজেক্ট পাই । CustomModelRepositoryপদ্ধতিটি ঘোষণা করতে হবে কার্যকর করতে হবে CustomModelRepositoryInterface। সুতরাং আমাদের এটি আছে Vendor\Module\Model\CustomModelRepository:

পাবলিক ফাংশন পেতে ($ আইডি)
    $ কাস্টমমোডেল = $ এটি-> কাস্টমমডেলফ্যাক্টরি-> তৈরি করুন ();
    $ CustomModel-> লোড ($ ID);
    যদি (! $ কাস্টমমডেল-> getId ())
      নতুন NoSuchEntityException নিক্ষেপ করুন (__ ('% 1 "আইডি সহ কাস্টমমডেল বিদ্যমান নেই' ', $ id));
    }
    রিটার্ন $ কাস্টমমডেল;
}

আমরা কি করছি ? আমরা CustomModelকারখানার জন্য একটি খালি অবজেক্ট তৈরি করি । পরবর্তী আমরা লোড CustomModelমডেল পদ্ধতিটি ব্যবহার করে ডেটা লোড করি । পরের আইডি সহ NoSuchEntityExceptionআমরা লোড করতে ব্যর্থ হলে পরবর্তী আমরা একটি ফিরে CustomModelআসি। তবে যদি সবকিছু ঠিক থাকে তবে আমরা মডেল অবজেক্টটি ফিরিয়ে দেব এবং জীবন চালিয়ে যাবে।

তবে বাহ ...! এই উদাহরণে এটি কি?

$customModel->load($id);

loadশুরুতে কি একই অবচয় পদ্ধতি নয় ? হ্যাঁ, তাই আমি মনে করি এটি একটি লজ্জাজনক, তবে আপনাকে এটিকে ব্যবহার করতে হবে যেহেতু এই লোড () পদ্ধতিতে কিছু ইভেন্ট প্রেরণ করা হয়েছে এবং বিকাশকারী তাদের শুনতে পাচ্ছেন (নীচে রাফেলের উত্তর দেখুন)।

ভবিষ্যতে, আমরা সত্তা পরিচালক দ্বারা সংরক্ষণ করা হবে। এটি একটি নতুন ম্যাজেন্টো 2 ধারণা হিসাবে অন্য গল্প, তবে আপনি যদি নজর রাখতে চান, সত্তা পরিচালক ইতিমধ্যে সিএমএস পৃষ্ঠার রিসোর্স মডেলটিতে প্রয়োগ করা হয়েছে (v2.1):

public function load(AbstractModel $object, $value, $field = null)
{
    $pageId = $this->getPageId($object, $value, $field);
    if ($pageId) {
        $this->entityManager->load($object, $pageId);
    }
    return $this;
}

উত্তর:


16

সেরা অনুশীলন: পরিষেবা চুক্তির মাধ্যমে

সর্বদা সর্বোত্তম অনুশীলন হ'ল যখনই সম্ভব হয় পরিষেবা চুক্তিটি ব্যবহার করা use আপনি এখানে কারণগুলির তালিকা পেতে পারেন: ম্যাজেন্টো 2: পরিষেবা চুক্তি ব্যবহারের সুবিধা কী?

কোনও পরিষেবার চুক্তি কীভাবে বাস্তবায়ন করা যায় সে সম্পর্কিত বিশদগুলির জন্য আমি আপনাকে এই বিষয়টি যাচাই করার পরামর্শ দিচ্ছি: ম্যাজেন্টো 2 এ কাস্টম মডিউলটির জন্য পরিষেবা চুক্তি কীভাবে প্রয়োগ করা যায়?

কোনও পরিষেবা চুক্তি উপলব্ধ না হলে

যদি কোনও পরিষেবা চুক্তি উপলভ্য না থাকে তবে আপনার উচিত মডেল সংগ্রহস্থল getপদ্ধতি। এই পদ্ধতিটি ব্যবহার করে আপনি CategoryRepositoryক্লাসের উদাহরণস্বরূপ ম্যাজেন্টো ক্যাচিং সিস্টেমটি থেকে উপকৃত হন :

public function get($categoryId, $storeId = null)
{
    $cacheKey = null !== $storeId ? $storeId : 'all';
    if (!isset($this->instances[$categoryId][$cacheKey])) {
        /** @var Category $category */
        $category = $this->categoryFactory->create();
        if (null !== $storeId) {
            $category->setStoreId($storeId);
        }
        $category->load($categoryId);
        if (!$category->getId()) {
            throw NoSuchEntityException::singleField('id', $categoryId);
        }
        $this->instances[$categoryId][$cacheKey] = $category;
    }
    return $this->instances[$categoryId][$cacheKey];
}

অবমানিত load()পদ্ধতি

ম্যাজেন্টো 2 আস্তে আস্তে উত্তরাধিকার ব্যবস্থাটি ফেলে রেখে নতুন সিটিইউডি সিস্টেম থেকে ধীরে ধীরে সরে যাচ্ছে এবং নতুন 2.1 এনটিটি ম্যানেজারটি ব্যবহার করে রচনাটির মাধ্যমে এটি প্রয়োগ করতে পারেন আপনি এখানে বিশদটি পেতে পারেন: ম্যাজেন্টো ২.১: সত্তা ব্যবস্থাপক ব্যবহার করে

অবহিত CRUD পদ্ধতিগুলি সম্পর্কে আপনি এই আকর্ষণীয় বিষয়টি পড়ার পরামর্শ দিই: অ্যাবস্ট্রাক্ট মডেলটিতে অবহিত সংরক্ষণ এবং লোড পদ্ধতিগুলি

কেন রিসোর্স মডেল লোড ব্যবহার করা হচ্ছে না

এর মূল কারণটি হ'ল আপনি যদি রিসোর্স মডেল loadপদ্ধতিটি ব্যবহার করেন তবে মডেল loadপদ্ধতিতে প্রয়োগ করা লোডিং সিস্টেমের কিছু গুরুত্বপূর্ণ অংশ আপনি এড়িয়ে যাবেন , দেখুন Magento\Framework\Model\AbstractModel:

public function load($modelId, $field = null)
{
    $this->_beforeLoad($modelId, $field);
    $this->_getResource()->load($this, $modelId, $field);
    $this->_afterLoad();
    $this->setOrigData();
    $this->_hasDataChanges = false;
    $this->updateStoredData();
    return $this;
}

loadসরাসরি রিসোর্স মডেল পদ্ধতিতে কল করার ফলে নিম্নলিখিত প্রভাবগুলি পড়বে:

  • _beforeLoad বলা হয় না: এভাবে ঘটনা প্রেরণের আগে মডেল লোড load
  • _afterLoad বলা হয় না: এভাবে ইভেন্টগুলি প্রেরণ না করে মডেল লোড
  • সঞ্চিত ডেটা আপডেট করা হয়নি যা বিভিন্ন সমস্যার কারণ হতে পারে (উদাহরণস্বরূপ আপনি যদি কল prepareDataForUpdateকরেন Magento\Framework\Model\ResourceModel\Db\AbstractDb)

ধন্যবাদ রাফেল, আপনি যা বলছেন তা প্রতিটি বিষয়বোধকে জ্ঞান করে এবং আমার জ্ঞানটি সম্পূর্ণ করে। তবে আমি বুঝতে পারছি না কেন ক্যান্ডি মন্তব্য করেছেন (তার উত্তরে) যে মারিয়াস তার কাস্টম মডিউল রিসোর্স মডেলের লোড () পদ্ধতিটি ব্যবহার করতে পারে? এটি [ magento.stackexchange.com/questions/114929/… অ্যাবস্ট্রাক্ট মডেলটিতে পদ্ধতি সংরক্ষণ করুন এবং লোড করুন) এ। কোন ধারনা ?
নিকোলাস পেরনট

@ নিকোলাসপর্নোট মূলত ক্যান্ডি ব্যাখ্যা করেছেন যে প্রতিটি মডিউলের জন্য এসএল (সার্ভিস লেয়ার) রাখার লক্ষ্য রয়েছে এবং প্রতিবার কোনও সত্ত্বা লোড করার সময় এটিই ব্যবহার করা উচিত। আমি আপনাকে তার উল্লেখ করে মন্তব্য করার পরামর্শ দিচ্ছি সম্ভবত তিনি একজন ম্যাগেন্টো ইনক কর্মচারী হওয়ায় তিনি আপনাকে আলোকিত করতে সক্ষম হবেন
রাফেল ডিজিটাল পিয়ানোজমে

ভাল, অবশেষে আমি আমার মূল পোস্টটি আপডেট করেছি। আপনার সাহায্যের জন্য আপনাকে রাফেল ধন্যবাদ।
নিকোলাস পার্নট

আমি দেখতে পাচ্ছি যে কমপক্ষে ম্যাজেন্টো ২.২-তে রিসোর্সমোডেলের লোডের মধ্যে গুরুত্বপূর্ণটি অন্তর্ভুক্ত রয়েছে, তাই সরাসরি রিসোর্সমোডেল পদ্ধতি ব্যবহার করা ঠিক হবে না, তাই না?
জোনিস এলমারিস

বর্তমানে, আমরা সুরক্ষা মডেল load()পদ্ধতিটি ব্যবহার করে মডেলটিকে নিরাপদে লোড করতে পারি । রিসোর্স মডেল নিজস্ব load()পদ্ধতি থেকে মডেলগুলির পদ্ধতিগুলি কল করে : $model->beforeLoad() { $this->_beforeLoad() }এবং$model->afterLoad() { $this->_afterLoad() }
sergei.sss

-2

আমি মনে করি নিম্নলিখিত বিবৃতি এখন বৈধ নয়।

Why not using the resource model load

আমরা Magento\Framework\EntityManager\Observerফোল্ডারটি সমস্ত ইভেন্ট খুঁজে পেতে পারি ।

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