Widzę, że znalazłeś właściwe rozwiązanie, chcę tylko podsumować.
Wstrzyknięcie konstruktora powinno być użyte do odzyskania pomocnika (lub dowolnej innej instancji) w dowolnej klasie:
class SomeClass
{
public function __construct(\Magento\Core\Helper\Data $helper)
{
$this->helper = $helper;
}
public function doSmth()
{
$this->helper->someMethod();
}
}
Zauważ, że nie są wymagane żadne komentarze phpDoc , Magento odczyta podpis konstruktora bezpośrednio, aby dowiedzieć się, jakie zależności są wymagane.
\ Magento \ Core \ Helper \ Factory powinien być używany tylko w tych rzadkich przypadkach, gdy trzeba wezwać wielu pomocników lub nie wiesz dokładnie, którego potrzebujesz.
Bezpośrednie korzystanie z Object Managera nie jest zalecane . Dlatego unikaj używania:
\Magento\Core\Model\ObjectManager::getInstance()
Jest tam tylko do serializacji / deserializacji.
helper
w szablonie, na przykład$this->helper('Magento\Catalog\Helper\Image')
, postępuje zgodnie z najlepszą praktyką?Wygląda na to, że Magento zachęca ludzi do korzystania z nowego systemu automatycznego wstrzykiwania zależności , aby wprowadzać pomocników i modele w obiekty za pomocą konstruktora obiektu.
Krótka wersja? Jeśli masz obiekt utworzony przez menedżera obiektów
i udekorujesz konstruktor za pomocą PHPDoc, a parametry mają odpowiedni zestaw wskazówek typu, menedżer obiektów automatycznie utworzy dla ciebie pomocnika (lub, jak sądzę, inne obiekty).@param
Na przykład następujący konstruktor wstrzykuje pomocniczy klucz danych do obiektu.
źródło
Oprócz wszystkich powyższych odpowiedzi, jeśli musisz użyć pomocnika w szablonie phtml, możesz po prostu zrobić tak:
Mam nadzieję, że to pomocne, jeśli ktoś wcześniej tego nie wiedział;)
źródło
Sposób tworzenia instancji helperów (przynajmniej dla nowego modułu Backend (~ dev50)) odbywa się za pośrednictwem helperFactory:
Co jest w zasadzie tylko wyspecjalizowanym typem fabryki modeli. Np .: Magento \ Core \ Block \ Context line 143 (dev50) jako część konstruktora:
Fabryka pomocników zwróci żądany model na podstawie nazwy klasy i zapewni, że jest to
instanceof
klasa abstrakcyjna pomocnika:Gdybyś sam to zaimplementował , wygląda na to, że rdzeń Magento ładuje go na jeden z dwóch sposobów:
Rzuć własną fabrykę:
Lub po prostu złap go bezpośrednio:
źródło
get
?Wypróbuj w ten sposób
źródło