Magento 2: właściwe wykorzystanie pomocników

9

Zaczynam widzieć coraz więcej osób deklarujących klasy pomocników, aby móc korzystać z następujących plików plików:

$this->helper('Path/To/Helper/Class')->customMethod();

Ten rodzaj kodu pozwala ludziom uniknąć bezpośredniego ograniczenia menedżera obiektów, ale zazwyczaj widzę w tych pomocnikach kod, który powinien być kodem blokowym.

Oto moje pytania:

  • co należy pisać w klasach pomocniczych?
  • w jakich przypadkach należy zastosować metody pomocnicze w szablonach?
Raphael at Digital Pianism
źródło

Odpowiedzi:

20

Nie rób
To jest jak używanie ObjectManager::getInstance()->create()w szablonie!
Zamiast tego użyj niestandardowego bloku, który odbiera pomocnika jako zależność konstruktora, i dodaj metodę proxy, która wywołuje metodę pomocnika.

W szablonie:

$block->customMethod()

W bloku:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

Mówiąc zgodnie z zasadą OOP, pozwala to uniknąć naruszenia „Prawa Demetera”. Zawiera szablon logiki biznesowej w bloku zamiast szablonu. Jako efekt uboczny powoduje również, że logika jest bardziej testowalna, gdy logika jest przenoszona do bloku.

Jeśli chodzi o logikę przypisaną klasom pomocniczym, stwierdzam, że w Magento 2 pomocnicy mają sens przede wszystkim dla usług, takich jak coś, co nie jest modelem, ale zawiera kod wielokrotnego użytku, na przykład formatowanie ceny (które jest zawarte w rdzeniu, ale mogę Pomyśl teraz o lepszym przykładzie).

Vinai
źródło
Zgadzam się z tą zasadą, jednak wygląda to tak, że używając preferencji di.xmldla typu klasy bloków, nie zachowuj żadnej konfiguracji układu. Próbowałem na przykład zrobić to dla klasy \Magento\Catalog\Block\Product\View\Type\Simple, szablon default.phtmlużyty w naszym szablonie jest ignorowany. Nie
mam
2
Wskoczę tutaj, aby uzyskać bardziej aktualne informacje. Od 2.2 rozszerzenie klas Bloków nie jest zalecane. Zamiast tego, jeśli wymagana jest niestandardowa logika prezentacji, należy zdefiniować ViewModel i zadeklarować go jako argument bloku w pliku layout.xml. Ponieważ ViewModels są budowane za pomocą Object Managera, możesz uporządkować własny wykres zależności bez narażania się na przełomowe zmiany w przyszłych wersjach Magento 2.
John Hall
1

Widzę pomocników jako funkcje globalne w twoim module (przepraszam za słowo „globalny”), a kontrakty menedżerskie / usługowe jako funkcje globalne, które mogą być używane zarówno wewnątrz, jak i na zewnątrz modułu.

Jeśli będziesz przestrzegać tej zasady, zobaczysz, że pomocnicy mają minimalne zastosowanie, używam ich tylko jako opakowania konfiguracji w moich modułach.

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

Tego rodzaju rzeczy. Jeśli masz inne funkcje, które mogą być praktyczne poza modułem, utwórz menedżera.

W idealnym świecie zewnętrzni programiści, którzy potrzebują funkcjonalności innych modułów, powinni jedynie szukać dostępnych interfejsów repozytoriów, menedżerów i innych elementów w Apifolderze -folder.

Giel Berkers
źródło