ম্যাজেন্টো 2-এ হেল্পারদের ইনস্ট্যান্ট করছে


26

ম্যাজেন্টো 2 এর সর্বশেষ বিল্ডগুলি Mageক্লাসটি শেষ করে দিয়েছে। এর অর্থ আমরা Mage::helperপদ্ধতিটি হারিয়ে ফেলেছি ।

ম্যাজেন্টো 2-এ ইনস্ট্যান্ট হেল্পারদের জন্য কি কোনও প্রতিস্থাপন কৌশল (সহায়ক সহায়ক কারখানা?) রয়েছে? অথবা আমরা নতুন অবজেক্ট ম্যানেজার ক্লাসটি ব্যবহার করব এবং সাহায্যকারীকে সিঙ্গেলটন / ক্যাশেড অবজেক্ট get(বনাম create) হিসাবে ইনস্ট্যান্ট করব বলে আশা করা হচ্ছে

উত্তর:


31

আমি দেখছি আপনি সঠিক সমাধানে এসেছেন, কেবল সংক্ষেপে বলতে চাই।

আপনার প্রয়োজনীয় ক্লাসে সাহায্যকারী (বা অন্য কোনও উদাহরণ) উদ্ধার করতে কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করা উচিত:

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

লক্ষ্য করুন যে কোনও পিএইচপিডোকের মন্তব্য প্রয়োজন নেই , ম্যাজেন্টো কোন নির্ভরতাগুলি প্রয়োজনীয় তা নির্ধারণের জন্য সরাসরি নির্মাতার স্বাক্ষরটি পড়বেন।

\ ম্যাজেন্টো ore কোর \ সহায়ক \ কারখানাটি কেবল সেই বিরল ক্ষেত্রেই ব্যবহার করা উচিত যখন আপনাকে প্রচুর একাধিক সাহায্যকারীকে কল করতে হবে বা আপনি ঠিক কোনটি প্রয়োজন তা জানেন না।

সরাসরি অবজেক্ট ম্যানেজারের ব্যবহার কঠোরভাবে নিরুৎসাহিত করা হয় । সুতরাং দয়া করে ব্যবহার এড়াতে:

\Magento\Core\Model\ObjectManager::getInstance()

এটি কেবল সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশনের জন্য রয়েছে।


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

@ অ্যান্টন ক্রিল যদি আমরা helperটেমপ্লেটে ব্যবহার করি , যেমন $this->helper('Magento\Catalog\Helper\Image'), এটি সর্বোত্তম অনুশীলন অনুসরণ করে?
খোয়া ট্রুংদিনহ

2
না, তা হয় না। টেমপ্লেটগুলিতে কেবল ব্লকগুলি উল্লেখ করা উচিত। সাহায্যকারীদের এড়ানো উচিত
আন্তন ক্রিল

10

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

সংক্ষিপ্ত সংস্করণ? আপনি একটি বস্তু যে বস্তুর ম্যানেজার দ্বারা instantiated এর থেকে থাকে, তাহলে একটি PHPDoc সঙ্গে একটি কন্সট্রাকটর সাজাইয়া রাখা@param , এবং পরামিতি একটি সঠিক টাইপ ইঙ্গিত সেট আছে, বস্তুর ম্যানেজার স্বয়ংক্রিয়ভাবে সাহায্যকারী instantiate হবে (অথবা, আমি বিশ্বাস করি, অন্যান্য বস্তু) আপনার জন্য।

উদাহরণস্বরূপ, নিম্নলিখিত কনস্ট্রাক্টরটি বস্তুতে এএএ কোর ডেটা সহায়ককে ইনজেকশন দেবে।

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

এটি সঠিক উত্তর - দুর্দান্ত sleuthing; অনেক খোঁড়াখুঁড়ি করার পরেও আমার কাছে একেবারে স্পষ্ট ছিল না।
ফিলিঙ্কল

2
ঠিক আছে ... এখন আমার মাথা ব্যাথা করছে ... অনেক বেশি। আপনি বোঝাতে চেয়েছেন যে কোডটি "লেখার" জন্য আমরা পিএইচপিডোক ব্যবহার করব? এটা পাগলামি. আমি ছেরে দিলাম.
মারিউস

@ মারিয়াস হাহাহা এটি কোনও সাধারণ বিষয় নয় - অ্যালানের ব্লগ এটি কিছুটা ব্যাখ্যা করে।
ফিলিভিঙ্কল

3
@philwinkle। আমি তার নিবন্ধ পড়েছি। খুব আকর্ষণীয়, তবে আমি এখনও বলি এটি পাগলামি। আমাকে পুরানো ফ্যাশন বলুন, তবে "আমার দিনগুলিতে ফিরে" কোডটি কোড ছিল এবং মন্তব্যগুলি সেগুলি ছিল যা প্রায় কেউই লিখতে বিরক্ত করেনি।
মারিয়াস

ওহ ... এবং ওয়েল +1 টি। ভাল প্রশ্ন এবং সুন্দর উত্তর।
মারিয়াস

7

উপরের সমস্ত উত্তরগুলি বাদে, যদি আপনাকে পিএইচটিএমএল টেমপ্লেটে সাহায্যকারী ব্যবহার করতে হয় তবে আপনি সহজভাবে এটি করতে পারেন:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');

আমি আশা করি যদি এটি আগে কেউ না জানত তবে এটি সহায়ক;


6

যেভাবে সাহায্যকারীদের তাত্ক্ষণিকভাবে চালিত করা হয় (কমপক্ষে নতুন ব্যাকএন্ড (~ dev50) মডিউলটির জন্য) হেল্পার ফ্যাক্টরির মাধ্যমে:

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

যা মূলত কেবলমাত্র একটি বিশেষ ধরণের মডেল কারখানা। উদাহরণস্বরূপ: নির্মাণের অংশ হিসাবে ম্যাজেন্টো \ কোর \ ব্লক \ প্রসঙ্গ লাইন 143 (dev50):

\Magento\Core\Model\Factory\Helper $helperFactory

সহায়ক কারখানাটি শ্রেণীর নামের উপর ভিত্তি করে অনুরোধ করা মডেলটি ফিরিয়ে দেবে এবং নিশ্চিত করবে যে এটি কোনও instanceofসহায়ক বিমূর্ত শ্রেণি:

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

আপনি যদি নিজেরাই এটি বাস্তবায়ন করতে থাকেন তবে মনে হয় ম্যাগেন্টো কোর এটি দুটি উপায়ে একটিতে লোড করছে:

আপনার নিজস্ব কারখানা রোল:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

বা কেবল এটি সরাসরি ধরুন:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
দরকারী তথ্যের জন্য +1, তবে আপনি কি সরাসরি কারখানার মতো কারখানাটি ইনস্ট্যান্ট করতে চান? অথবা একটি একক সহায়ক কারখানাটি কি অবজেক্ট ম্যানেজারের সাথে ক্যাশেড ক্লাস হিসাবে ইনস্ট্যান্ট করা উচিত get?
অ্যালান ঝড়

এটি সম্পূর্ণ পরিষ্কার নয়, কারণ সহায়ক কারখানাটি \ ম্যাজ \ কোর \ ব্লক \ অ্যাবস্ট্রাক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে - আমি মনে করি উদ্দেশ্যটি আপনার নিজের সহায়ক কারখানা সরবরাহ করবে। যদিও তারা ইচ্ছাকৃতভাবে কারখানার জন্য একটি সিঙ্গলটন তৈরি করছে দেখে মনে হচ্ছে না
ফিলিভিঙ্কল

আমার মতো লাগার মতো / সেরা উত্সটি হ'ল _হেল্পফ্যাক্টরিটিকে কীভাবে সেই জিনিসগুলিতে ইনজেক্ট করা হয় এবং এটি কীভাবে মূল দল এটি ইনস্ট্যান্ট করে তা দেখুন to
অ্যালান ঝড়

আমার সরলীকরণের সারাংশ যেমন ভুল তেমনি নির্মাণকারীর অবজেক্টম্যানেজারের একটি দৃষ্টান্ত প্রয়োজন। আমি মুহূর্তে সম্পাদনা করব।
ফিলিঙ্কল

সম্পাদনা দেখুন। এটি কাজ করা উচিত - এই মুহূর্তে নির্ধারণ করা কঠিন কারণ আমার ক্লিপ শেল পরিবেশ প্রত্যাশা অনুযায়ী স্টোর কনফিগারেশন উদাহরণটি লোড করছে না। যদিও আপনাকে সঠিক পথে পৌঁছানোর জন্য এটি যথেষ্ট হবে।
ফিলিঙ্কল

0

এইভাবে চেষ্টা করুন

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

সরাসরি অবজেক্ট ম্যানেজারের ব্যবহার কঠোরভাবে নিরুৎসাহিত করা হয়।
এসভি

@ এসভি 3 এন আপনি দয়া করে ব্যাখ্যা করতে পারেন, কারণটি কী ?. ধন্যবাদ।
তুষান

1
পরিবর্তে আরও ভাল ব্যবহার নির্ভরতা ইনজেকশনগুলি ... উদাহরণস্বরূপ এখানে উত্তর দেওয়া হয়েছে ... magento.stackexchange.com/questions/142352/…
sv3n
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.