Co to jest pomocnik w Magento?

22

Co to jest pomocnik w Magento?

W jakich przypadkach należy korzystać, a nie korzystać z pomocy?

Naddźwiękowy
źródło

Odpowiedzi:

27

Teoretycznie nigdy nie powinieneś używać pomocników.
Pomocnicy są tylko kolekcjami niepowiązanych metod i zawsze są tworzone jako singletony.
Jest to w zasadzie programowanie proceduralne z funkcjami zgrupowanymi pod pewną przestrzenią nazw (w tym przypadku nazwą klasy). Ale ponieważ Magento ma w centrum pomocników, możesz umieścić tam swoje metody, w których nie masz pojęcia, gdzie je umieścić lub jeśli chcesz zadzwonić do nich w wielu różnych miejscach (modele, kontrolery, szablony)

Użyj ich w ostateczności.

Również Magento wymaga pomocnika dla każdego modułu ze względu na tłumaczenie.
Możesz po prostu stworzyć pomocnika wywoływanego Data.phpw każdym module i pozostawić go pustym.

Marius
źródło
Jedynym prawdziwym „wykorzystaniem”, jakie znalazłem dla pomocników, jest to, że mają gwarancję, że zawsze będą singlem. Pracowałem nad jakimś kodem edukacyjnym, który ładował kolekcje w foreachpętlach i wszelkiego rodzaju szaleństwo. Przekonałem pomocnika o tym przerażającym logice i wykorzystałem go jako pamięć podręczną obiektów, aby był użyteczny, i zostawiłem niewiele miejsca na błędy od przyszłych programistów, którzy mogliby przypadkowo zadzwonić getModelzamiast getSingleton, gdybym umieścił go w modelu.
Luke Rodgers,
@LukeRodgers. Rozumiem twój punkt widzenia, ale nie sądzę, że „może przypadkowo wywołać getModel zamiast getSingleton” kwalifikuje się jako prawdziwy powód do korzystania z pomocy. Mogę argumentować, że można „przypadkowo” wywołać „usuń” zamiast „zapisać”. Jaką ochronę możesz zrobić, aby tego uniknąć? Myślę, że „zwracanie uwagi” jest częścią rozwoju oprogramowania.
Marius
Zgoda. Wydaje mi się, że w tych scenariuszach po prostu próbuję obronnie obronić ludzkość.
Luke Rodgers
Jak poszedłbyś o dodawanie niestandardowych metod do podstawowych pomocników?
tecjam
13

Pytanie ma dwa aspekty:

  1. Czy powinienem napisać własnych pomocników i po co?
  2. Czy powinienem używać podstawowych pomocników i po co?

1. Pisanie pomocników

W ogóle, po nazwie klasy Helper, Utillub podobny tylko mówi: „Mam pewne funkcje, które nie wiem gdzie umieścić” i nie ma większego sensu w klasie.

Magento tworzy pomocników jako singletony, a większość głównych pomocników nie ma żadnego stanu, więc metody równie dobrze mogą być bez klasy, a staticnawet functionsbez niej. Wszystko to jest często uważane za zapach kodu , wadę w projekcie aplikacji.

Jak już wskazał Marius, nie musisz używać pomocników do tworzenia własnego kodu. Po prostu utwórz domyślny pusty pomocnik dla modułu, jeśli korzystasz z tłumaczeń specyficznych dla modułu, w przeciwnym razie nie będą działać. Preferuj modele (które nie muszą rozszerzać, Mage_Core_Model_Abstractjeśli nie reprezentują danych bazy danych) lub niezależne klasy bibliotek.

Nie byłbym jednak zbyt surowy, by „w ogóle nie używać pomocników” i zamiast tego używać ich do skrótów zapytań, takich jak:

  • konfiguracja modułu dostępu:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • metody fabryczne dla klas bibliotecznych

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

Można znaleźć inne miejsca, ale IMHO, pomocnik modułu jest często wystarczający do takich rzeczy.


2. Korzystanie z pomocników

Spożywanie podstawowych pomocników jest czymś, co często będziesz robić.

Przykłady:

  • __()metoda tłumaczenia: Aby uzyskać tłumaczenie konkretnego modułu, należy użyć Mage::helper('module-alias')->__('string to be translated'). Dzieje się tak domyślnie, jeśli używasz $this->__(...)w szablonie lub bloku i jeśli używasz translate="..."atrybutu w plikach XML
  • Mage::helper('core') metody: lokalizowanie daty, formowanie ceny i waluty, unikanie i kodowanie danych
  • Mage::helper('tax') metody uzyskiwania informacji z konfiguracji podatkowej i obliczania na ich podstawie cen
  • Mage::helper('catalog/image') zapewnia interfejs do tworzenia buforowanych obrazów o zmienionym rozmiarze i pobierania ich adresów URL
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() łączy tabelę przepisywania adresów URL z zapytaniem dotyczącym kolekcji produktów.

Istnieje wiele innych (mniej lub bardziej) przydatnych funkcji ukrytych w podstawowych helperach, jeśli potrzebujesz konkretnej funkcji, która prawdopodobnie będzie gdzieś używana w rdzeniu, sprawdź, czy możesz ponownie użyć metody pomocniczej.

Zazwyczaj te pomocniki są obiektami bezstanowymi, a metody są metodami zapytań (tzn. Nie mają skutków ubocznych)

Ale jak zawsze Magento łamie własne niepisane zasady i nie należy go traktować jako przykładu. A „dobry” przykład jak nie używać pomocników jest Mage_Catalog_Helper_Product_Comparektóry ma $_itemCollectionwłaściwość, że może zostać zainicjowany tylko raz i $_customerIdwłaściwości, które mogą być zmieniane za pomocą seter. Znajdziesz jeszcze kilka pomocników związanych z katalogiem z załączonymi kolekcjami. Pisanie testów dla kodu, który ich używa lub ponownego użycia w innym kontekście, nie jest fajne, więc nie rób tego w domu.

catalog/imagePomocnik wspomniano powyżej jest kolejnym przykładem pomocnika, które naprawdę nie powinny być pomocnikiem. Musisz przekazać produkt, init()który najpierw resetuje jego bieżący stan, a następnie ustawiasz różne parametry (jak resize(), setQuality()), a na końcu możesz uzyskać adres URL za pomocą jego __toString()metody. Wygląda to ładnie, gdy jest używane w szablonie, ale kod jest ogromnym bałaganem i nie ma sensu jako singleton.


TL; DR:

  • Podstawowe pomocniki zawierają przydatne narzędzia.
  • Potrzebujesz pomocy w tłumaczeniu
  • Pomocnicy powinni być bezpaństwowcami
  • We własnych modułach unikaj używania pomocników jako kolekcji różnych funkcji. W większości przypadków można znaleźć bardziej odpowiednie miejsce
Fabian Schmengler
źródło
Często korzystałem z pomocy w prostych integracji ERP opartych na plikach płaskich. Wszystko, co robią, to zapisywanie i odczytywanie plików z lokalnych katalogów oraz aktualizowanie innych obiektów (produktu, zamówienia itp.). W wymienionych przypadkach nie mają własnych stanów ani odpowiednich tabel. Jakie jest twoje zdanie na ten temat?
musicliftsme
1
To narusza „brak skutków ubocznych”. Mój zwykły spojrzenie na odczyt i zapis plików są Readeri Writermodele, które rzeczywiście zrobić mają państwo (przynajmniej zasób plików). Na przykład do odczytu danych o statusie zamówienia z pliku CSV miałbym coś. lika OrderStatusCsvReadermodel używany przez OrderStatusUpdatermodel. W ten sposób odseparowałem także obawy dotyczące „odczytu danych z pliku” i „kolejności aktualizacji w Magento”
Fabian Schmengler
4

Marius ma rację. Myślę, że pomocnicy to bzdury.

Ale w teorii magento należy umieścić wszystko w pomocnikach, które nie zmieniają stanu obiektu, np. Uzyskać sformatowaną cenę.

Ale wszystko, co możesz włożyć do pomocnika, możesz też włożyć do modelu. I możesz uzyskać różne instancje modelu, co jest pomocne w testowaniu.

Fabian Blechschmidt
źródło
2

Jestem całkiem nowy w Magento, ale dla mnie wygląda na to, że Pomocnik jest odpowiednikiem usługi Magento : „zestaw powiązanych funkcji oprogramowania, które można ponownie wykorzystać do różnych celów”. Moduł eksportuje swoją oferowaną funkcjonalność za pośrednictwem usług. Użyj pomocnika dla funkcji, do których korzystania zaprosiłeś inne moduły.

Model powinien zapewniać tylko metody bezpośrednio związane z uzyskaniem lub ustawieniem stanu obiektu lub w inny sposób powiązane z utworzonym obiektem modelu.

Patrick van Bergen
źródło
1

Pomagają zapobiegać powielaniu kodu (w modelach, szablonach, ...), a czasem są po prostu konieczne.

  • w celu sprawdzenia, czy moduł niestandardowy jest włączony, możesz umieścić coś takiego jak Mage::getStoreConfigFlag('my/module/enabled')każdy plik, w którym chcesz to sprawdzić, lub korzystasz Mage::helper('my_module')->isEnabled()z zalet:
    • jeśli np. ścieżka konfiguracji ulegnie zmianie z jakiegoś powodu, wystarczy dostosować jeden plik
    • możesz przepisać isEnabled()metodę helpers i wpłynie to na wszystkie klasy, które z niej korzystają, zamiast przepisywać kilka plików
  • 13. @ Jak napisać własne rozszerzenie? : Nie przepisuj klas, chyba że jest to konieczne. Użyj obserwatorów, a jeśli nie jest możliwe użycie metod pomocniczych, które otrzymują jako parametr i instancję klasy, którą chcesz przesłonić. Źle: Zastąp, Mage_Catalog_Model_Productaby dodać metodę getProductArticles(). Racja . W swoim pomocniku dodajgetProductArticles(Mage_Catalog_Model_Product $product)
  • uelastycznij aktualizacje układu za pomocą <action method="someMethod"><var helper="module/method" /></action>

Możesz po prostu stworzyć pomocnika wywoływanego Data.phpw każdym module i pozostawić go pustym .

Podczas korzystania z PHPUnit powinieneś dodać jedną linię :protected $_moduleName = 'My_Module';

sv3n
źródło