Magento 2'deki Yardımcının Örneklenmesi


26

Magento 2'nin en yeni yapıları, Magesınıfla birlikte ayrıldı. Bu, Mage::helperyöntemi kaybettiğimiz anlamına gelir .

Magento 2'deki yardımcıları örneklemek için bir yedek teknik (yardımcı fabrika?) Var mı? Ya da yeni Object manager sınıfını kullanmamız bekleniyor ve yardımcısını get(vs. create) ile tekil / önbelleğe alınmış bir nesne olarak başlatmanız yeterli.

Yanıtlar:


31

Görüyorum ki doğru çözüme ulaştınız, sadece özetlemek istiyorum.

Yapıcı enjeksiyon, ihtiyaç duyduğunuz sınıftaki yardımcı (veya başka bir örneği) almak için kullanılmalıdır:

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

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

Hiçbir phpDoc yorumunun gerekli olmadığına dikkat edin , Magento hangi bağımlılıkların gerekli olduğunu bulmak için doğrudan yapıcı imzasını okuyacak.

\ Magento \ Core \ Helper \ Factory yalnızca çok sayıda yardımcı çağırmanız gerektiğinde veya hangisine ihtiyacınız olduğunu tam olarak bilmediğinizde, nadir durumlarda kullanılmalıdır.

Doğrudan Nesne Yöneticisinin kullanımı kesinlikle önerilmez . Lütfen kullanmaktan kaçının:

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

Sadece seri hale getirme / seri kaldırma için var.


Statik kullanmayın, çünkü PHP ünitesi ile test edilemez ve evet bu önerilmez. Tüm M2 bağımlılıkları yapıcı aracılığıyla yapılır ve Nesne Yöneticisi tarafından dahili olarak yönetilir ve bunu Singleton olarak alır. Ayrıca özellik görünürlüğünü belirtmek için _ kullanmayın, Tüm M2 adlandırmaları camecase kullanmalıdır
PartySoft

@Anton Kril helperşablonda kullanırsak $this->helper('Magento\Catalog\Helper\Image'), en iyi uygulamayı izler mi?
Khoa TruongDinh

2
Hayır, değil. Şablonlar sadece bloklara referans vermelidir. Yardımcılar kaçınılmalıdır
Anton Kril

10

Magento'nun, yeni otomatik bağımlılık enjeksiyon sistemini, yardımcıları ve modelleri nesnenin yapıcısı aracılığıyla nesnelere ulaştırmak için kullanmaya teşvik eden insanlara benziyor .

Kısa versiyon? Nesne yöneticisi tarafından başlatılan ve bir yapıcıyı PHPDoc ile süsleyen bir nesneniz varsa @paramve parametreler uygun bir tür ipucu ayarına sahipse , nesne yöneticisi sizin için yardımcıyı (veya, diğer nesnelere inanıyorum) otomatik olarak başlatır.

Örneğin, aşağıdaki yapıcı nesneye bir çekirdek veri yardımcısını enjekte edecektir.

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

Bu doğru cevap - harika uyuma; Çok fazla kazıdan sonra bile bana tamamen açık değildi.
Philwinkle

2
Tamam ... şimdi başım ağrıyor ... çok fazla. PHPDoc'u "yazma" kodunu kullanmamız gerektiği anlamına mı geliyor? Bu delilik. Bıraktım.
Marius

@Marius hahaha bu kadar nadir değildir - Alan'ın blogu bunu bir dereceye kadar açıklıyor.
Philwinkle

3
@philwinkle. Makalesini okudum. Çok ilginç, ama bunun hala delilik olduğunu söylüyorum. Bana eski moda diyorsun, ama "günlerime döndüm" kodu koddu ve yorumlar neredeyse hiç kimsenin yazmaktan hoşlanmadığı şeylerdi.
Marius

Oh ... ve bu arada. +1. İyi soru ve güzel cevap.
Marius

7

Yukarıdaki tüm cevapların dışında, eğer phtml şablonunda yardımcı kullanmak zorundaysanız, basitçe aşağıdakileri yapabilirsiniz:

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

Umarım birileri daha önce bilmeseydi yardımcı olur;)


6

Yardımcıların somutlaştırılma şekli (en azından yeni Backend (~ dev50) modülü için) yardımcı bir fabrikadan yapılır:

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

Temelde sadece bir model fabrikasının uzmanlaşmış bir türüdür. Örn: yapıcının bir parçası olarak Magento \ Core \ Block \ Context line 143 (dev50):

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

Yardımcı fabrika, istenen modeli sınıf adına göre döndürür instanceofve yardımcı soyut sınıf olduğundan emin olur :

/**
 * 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;
}

Bunu kendiniz uygularsanız , Magento çekirdeği onu iki yoldan biriyle yüklüyor gibi görünüyor:

Kendi fabrikanı üret:

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

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

Veya doğrudan doğrudan alın:

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

1
Yararlı bilgiler için +1, ancak fabrikayı doğrudan böyle başlatmak ister misiniz? Yoksa tek bir yardımcı fabrika Nesne Yöneticisi ile önbelleğe alınmış bir sınıf olarak başlatılmalı getmı?
Alan Storm,

Tamamen açık değil, çünkü yardımcı fabrika \ Mage \ Core \ Block \ Abstract'dan devralındı ​​- Sanırım niyetiniz kendi yardımcı fabrikanızı sağlamak. O mu değil kasıtlı fabrikası için a tek oluşturuyorsunuz olsa, bak.
Philwinkle

İhtiyacım var gibi geliyor / en iyi kaynak, _helperFactory'nin bu nesnelere nasıl enjekte edildiğini izlemek ve çekirdek ekibin onu nasıl başlattığını görmek.
Alan Storm,

Benim sadeleştirme özetim yanlıştır, yapıcı bir ObjectManager örneği gerektirir. Anlık olarak düzenleyeceğim.
Philwinkle

Düzenlemeye bakınız. Çalışması gerekir - bu noktada belirlemek zor, çünkü cli kabuk ortamım mağaza yapılandırma örneğini beklendiği gibi yüklemiyor. Bu olsa da, sizi doğru yola sokmanız için yeterli olmalı.
Philwinkle

0

Bu şekilde dene

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

Nesne Yöneticisi'nin doğrudan kullanımı kesinlikle önerilmez.
sv3n

@ sv3n lütfen nedenini açıklayabilir misiniz? Teşekkürler.
Böylece,

1
Bunun yerine bağımlılık enjeksiyonlarını daha iyi kullanın ... örneğin burada cevaplandı ... magento.stackexchange.com/questions/142352/…
sv3n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.