কারণ আমার পক্ষে সঠিক উপায়টি খুঁজে পাওয়া শক্ত ছিল, নীচে আপনি আমার তৈরি সেরা অনুশীলনটি খুঁজে পেতে পারেন। উপভোগ করুন, প্রয়োজনে আমার ইংরেজি সংশোধন করুন এবং বলুন আমি যদি ভুল হয়ে থাকি। :)
সম্পাদনা: ... এবং আমি জানতে পারি যে আমি কিছু দিক থেকে ভুল ছিল। রাফেলের উত্তরগুলি আমাকে আরও বুঝতে সাহায্য করার পরে আমি মূল পোস্টটি আপডেট করেছি। তাকে ধন্যবাদ!
ধারণাটি নীচে ব্যবহার করা হয়েছে :
আপনি যদি এই ধারণাগুলিতে স্বাচ্ছন্দ্য বোধ করেন তবে নীচের কোডগুলি এবং ব্যাখ্যাগুলি বোঝা আপনার পক্ষে সহজ হবে:
- ইনজেকশন নির্ভরতা (
$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;
}