কোনও মডেল লোড করার উপযুক্ত উপায় কী এবং কেন


9

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

এখনও অবধি আমি সবসময় কনস্ট্রাক্টরে মডেল ব্যবহার করি এবং তারপরে কেবল এটি লোড করি।

public function __construct(
    \Vendor\Module\Model\Something $somethingModel
) {
    $this->somethingModel = $somethingModel;
}

public function getTestById($id) {
    return $this->somethingModel->load($id);
}

এবং এটি সর্বদা উদ্দেশ্য হিসাবে কাজ করেছিল, আমি এটিও বেশ নিশ্চিত যে এটি কমপক্ষে মূলত ব্যবহৃত হয়েছিল।

কিন্তু তখন আমি আমার এক সহকর্মী ব্যবহার করতে দেখেছি

modelFactory->create()->load($id)

যতদূর আমি বুঝতে পারি কারখানাগুলি একটি নতুন সত্তা তৈরিতে ব্যবহৃত হচ্ছে, উদাহরণস্বরূপ, যদি আমি একটি নতুন পণ্য তৈরি করতে চাইতাম তবে আমি কারখানাটি তৈরি করতে পারি, এটি ডেটা দিয়ে পপুলেট করতে পারি এবং তারপরে এটি সংরক্ষণ করতে পারি। তবে আবার, আমি বিষয়টি নিয়ে গবেষণা শুরু করেছিলাম এবং আমি ফ্যাবিয়ান শেমংলার ( ম্যাজেন্টো 2-তে কখন একটি রিপোজিটরি এবং কারখানা ব্যবহার করব? ) এর উদাহরণ পেয়েছি, যারা এইভাবে মডেলটি লোড করছিলেন এবং অন্যদেরকে কেবল মডেলগুলি লোড করা থেকে নিরুৎসাহিত করেছিলেন, তিনি করেননি ' যদিও এটি 'পরিষেবা চুক্তির অংশ নয়' বলার পাশাপাশি কেন ব্যাখ্যা করবেন না। আমি যতদূর জানি রিপোজিটরিগুলি পরিষেবা চুক্তির অংশ, সুতরাং কোনও মডেলের লোডিংয়ের ক্ষেত্রে যখন এখানে কোনও সংগ্রহস্থলের মাধ্যমে পাওয়া যায় না তখন আমি এখানে কোনও সংযোগ দেখতে পাই না।

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

হ্যাঁ, কেউ আমাকে বলতে পারেন যে সঠিক উপায়টি এবং কেন আমি অন্য সমস্ত পদ্ধতির পরিবর্তে এটি ব্যবহার করব?


আমি আক্ষরিকভাবে এই থ্রেডটিকে বিভ্রান্তিকর উদাহরণ হিসাবে সংযুক্ত করছি, আপনি কি আমার পোস্টটি পড়েছেন?
সিজেএস

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

উত্তর:


12

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

public function __construct(
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
    $this->productRepository = $productRepository;
    /** @var \Magento\Catalog\Api\Data\ProductInterface $product */
    $this->productRepository->save($product);
}

যদি কোনও সংগ্রহস্থল উপস্থিত না থাকে তবে রিসোর্স মডেলটি ব্যবহার করুন । মনে রাখবেন যে রিসোর্স মডেলগুলিতে কোনও রাজ্য থাকে না: তারা তাদের 'নিয়মিত' মডেলগুলির জন্য দৃ pers়তা ব্যবহার করে। সুতরাং আপনাকে কারখানা ব্যবহার করে এগুলি অন্তর্ভুক্ত করার দরকার নেই:

public function __construct(
    \Magento\Catalog\Model\ResourceModel\Product $productResource,
    \Magento\Catalog\Model\ProductFactory $productFactory
) {
    $this->productResource = $productResource;
    $this->productFactory = $productFactory;
    ...
    /** @var \Magento\Catalog\Api\Data\ProductInterface $product */
    $product = $this->productFactory->create();
    $this->productResource->save($product);
}

"তাহলে কি সুবিধা কোনও সংস্থান মডেলটির তুলনায় কোনও পরিষেবা চুক্তি / সংগ্রহস্থল আনবে?" আপনি জিজ্ঞাসা করতে পারেন। ঠিক আছে, তাত্ত্বিকভাবে একটি রিসোর্স মডেল কেবলমাত্র একটি ডেটা মডেলের অধ্যবসায়ের জন্য দায়বদ্ধ হওয়া উচিত , অন্যদিকে কোনও সত্ত্বা সংরক্ষণের ক্ষেত্রে জড়িত অতিরিক্ত কাজগুলিকে একটি সংগ্রহস্থলও বিবেচনা করে। সূচকগুলি আপডেট করার বিষয়ে চিন্তা করুন, অন্যান্য সত্তার সাথে সম্পর্ক তৈরি করা ইত্যাদি This এটি তত্ত্ব, যদিও বাস্তব জীবনে এই রেখাগুলি প্রায়শই ঝাপসা হয়ে থাকে। তবে এটি মনে রাখা আপনার পক্ষে ভাল।

আপনি করা উচিত নয় ব্যবহার মডেলের 'সরাসরি save(), load()ইত্যাদি -methods। এগুলি অবজ্ঞা করা হয়েছে কারণ এটি অর্থপূর্ণ ভুল। একটি নিবিড় উপায়ে এটি সম্পর্কে চিন্তা করুন:

  • (ডেটা) মডেলগুলিতে কেবল ডেটা থাকার জন্য দায়বদ্ধ হওয়া উচিত।
  • রিসোর্স মডেলগুলি এই জাতীয় ডেটার অধ্যবসায়ের জন্য দায়ী হতে হবে।
  • দৃ pers়তা ক্রিয়াগুলির জন্য মডিউলটির অভ্যন্তরে এবং বাইরে যোগাযোগের জন্য সংগ্রহস্থলগুলিকে দায়ী করা উচিত ।

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

উপসংহারে

আপনার প্রশ্নের উত্তর দিতে: পছন্দ অনুসারে। কোনও মডেল লোড করার সঠিক উপায় হ'ল:

  • যদি কোনও সংগ্রহস্থল থাকে তবে এটি সংগ্রহস্থল ব্যবহার করে লোড করুন।
  • কেবলমাত্র কোনও সংগ্রহস্থল না থাকলে, রিসোর্স মডেল (কারখানার সাথে মিশ্রিত) ব্যবহার করুন।

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

@czs আপনি সঠিক বলেছেন আমি একই জন্য মডেল লোড করার জন্য আরও বর্ণনামূলক উদাহরণ যুক্ত করেছি।
মিলিন্দ সিং

2
  • Modelsহ'ল ডেটা ইন্টারফেসটি কেবলমাত্র বস্তুগুলিতে ডেটা ধরে রাখতে ব্যবহৃত হয়, অর্থাত setএবং getএকটি সারির জন্য ডেটা।
  • ResourceModelsহ'ল এমন একটি প্রক্রিয়া যা এই জাতীয় ডেটার অধ্যবসায়ের জন্য দায়ী, যেমন এসকিউএল কোয়েরি বাস্তবায়িত করে saveবা বস্তুটিতে loadডেটা Model

করার সঠিক উপায় loadএবং saveএকটি তৈরি করে হওয়া উচিত সংগ্রহস্থলের বা একটি সম্পদ থেকে লোড করা হচ্ছে নিম্নরূপ:

namespace MyVendor\MyModule\Model;

class QueueRepository impliments \MyVendor\MyModule\Api\QueueRepositoryInterface
{

    /** @var \MyVendor\MyModule\Model\ResourceModel\Queue  */
    public $resource;

    /** @var \MyVendor\MyModule\Model\QueueFactory  */
    public $modelFactory;

    public function __construct(
        \MyVendor\MyModule\Model\ResourceModel\Queue $resource,
        \MyVendor\MyModule\Model\QueueFactory $modelFactory
    ) {
        $this->resource = $resource;
        $this->modelFactory = $modelFactory;
    }

    /**
     * Save
     * @param \MyVendor\MyModule\Api\Data\QueueInterface $queue
     * @return $queue
     * @throws \Exception
     */
    public function save(\MyVendor\Integrator\Api\Data\QueueInterface $queue)
    {
        $this->resource->save($queue);
        return $queue;
    }

    /**
     * Save
     * @param \MyVendor\MyModule\Api\Data\QueueInterface $queue
     * @param int $id
     * @return $queue
     * @throws \Exception
     */
    public function load(\MyVendor\MyModule\Api\Data\QueueInterface $queue, $id)
    {
        $this->resource->load($queue, $id);
        return $queue;
    }

    public function getById($id)
    {
        $queue = $this->modelFactory->create();
        $this->resource->load($queue, $id);
        return $queue;
    }
}

এখানে, মডেল \MyVendor\MyModule\Api\Data\QueueInterfaceদ্বারা implmented হয় Queue

সুতরাং, পর্দার পিছনে, আমরা আসলে একটি Modelবস্তু তৈরি করছি তখন loadingএটি ResourceModelবস্তুর দ্বারা by এটি লোড বা সংরক্ষণের সঠিক উপায়।

        $queue = $this->modelFactory->create();
        $this->resource->load($queue, $id);
        return $queue;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.