ডিআই এবং ম্যাজেন্টো 2 এ একটি ব্লক প্রসারিত করা হচ্ছে


15

আমি মনে করি যে ব্লকগুলির সাথে ম্যাজেন্টো 2 নির্ভরতা ইনজেকশনটি উপলব্ধি করার জন্য আমি লড়াই করছি, প্রতিবারই আমি কোনও ব্লকটি প্রসারিত করার চেষ্টা করব যা \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক work দেখুন \ উপাদান \ টেমপ্লেটটি আমি ত্রুটিগুলি সহ শেষ করি না।

আমি এমন একটি ব্লক তৈরি করতে চাই যা মাগেন্তো \ থিম \ ব্লক \ এইচটিএমএল \ শিরোলেখ \ লোগোর খুব প্রাথমিক ব্লক শ্রেণি প্রসারিত করে - যতক্ষণ না আমি নির্মাণ পদ্ধতির মধ্যে নির্ভরতা ইনজেকশন চেষ্টা না করি সবকিছু ঠিকঠাক কাজ করে:

<?php

namespace Creare\Test\Block\Header;

class Logo extends \Magento\Theme\Block\Html\Header\Logo
{

    protected $_creareHelper;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Creare\Seo\Helper\Data $creareHelper,
        array $data = []
    )
    {
        $this->_creareHelper = $creareHelper;
        parent::__construct($context, $data);
    }
}

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

Recoverable Error: Argument 2 passed to Magento\Theme\Block\Html\Header\Logo::__construct() must be an instance of Magento\MediaStorage\Helper\File\Storage\Database, array given, called in /Users/adammoss/PhpstormProjects/Magento2/app/code/Creare/Test/Block/Header/Logo.php on line 17 and defined in /Users/adammoss/PhpstormProjects/Magento2/app/code/Magento/Theme/Block/Html/Header/Logo.php on line 33

আমি যদি আমার __ কনস্ট্রাক্টের মতো ফাইলটি যেভাবে প্রসারিত করি তার সাথে একই নির্ভরতা যুক্ত করি তবে শ্রেণি উত্তরাধিকারের দিক হিসাবে জিনিসগুলি করার পিছনের দিকটি কি আমি পিতামাতার সমস্ত পদ্ধতি এবং বৈশিষ্ট্যগুলি শোষিত করি?

আমি মনে করি ক্লাস থেকে বাড়ানো এবং ম্যাজেন্টো ২ দিয়ে ডিআই ব্যবহার করার বিষয়ে কারও কাছ থেকে আমার কেবল একটি প্রাথমিক 101 টি ব্যাখ্যা দরকার need যে কোনও সাহায্যের প্রশংসা করুন!


"নিশ্চয়ই এটি কাজ করার পিছনের দিক" সম্মত।
জেমস

উত্তর:


19

আপনি যে শ্রেণীরটিকে প্রসারিত করার চেষ্টা করছেন তার এই নির্মাণকারীর রয়েছে:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    array $data = []
) {
    $this->_fileStorageHelper = $fileStorageHelper;
    parent::__construct($context, $data);
}

সুতরাং আপনার কনস্ট্রাক্টরটিকে আপনার মতো করে দেখাতে হবে

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    \Creare\Seo\Helper\Data $creareHelper,
    array $data = []
)
{
    $this->_creareHelper = $creareHelper;
    parent::__construct($context, $fileStorageHelper, $data);
}

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


2
এটি আপনার উত্তরের জন্য ধন্যবাদ জানায়। আমি অনুমান করি যে আমি এটির চেয়ে আরও মার্জিত বলে আশা করছি।
অ্যাডাম মস

@ মারিয়াসের ক্রমটি প্যারেন্ট বর্গের মতো হওয়া দরকার __ কাঠামো পদ্ধতি পদ্ধতির আর্গুমেন্টগুলি, আপনার কাস্টম আর্গুমেন্টগুলি শেষে শেষ হওয়া দরকার।
চিরাগ দোদিয়া

@ চিরাগদোদিয়া কেন? আমি তাই মনে করি না. এম 2 এ আমি এখনও নির্মিত সমস্ত কিছুই আমি কাস্টম কনস্ট্রাক্ট যুক্তিগুলি এলোমেলোভাবে যুক্ত করে ব্যবহার করে তৈরি করেছি। এবং এটা কাজ করে. একমাত্র সীমাবদ্ধতা হ'ল ডিফল্ট মান সহ যুক্তিগুলি শেষ হওয়া উচিত।
মারিয়াস

@ মারিয়াস হ্যাঁ এটি বেশ কয়েকটি ক্ষেত্রে কাজ করছে তবে আমার ক্ষেত্রে যখন আমি প্রসারিত করেছি \ ম্যাজেন্টো \ ক্যাটালগ \ ব্লক working পণ্য its এটি কাজ করছে না তা দেখার জন্য আমাকে প্যারেন্ট কন্সট্রাক্টরের মতো একই যুক্তি তৈরি করতে হবে এবং শেষ পর্যন্ত কাস্টম যুক্তি যুক্ত করা দরকার। এখানে আমার কোডটি একবার দেখুন: magento.stackexchange.com/questions/95697/…
চিরাগ দোদিয়া

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