Co to jest pomocnik w Magento?
W jakich przypadkach należy korzystać, a nie korzystać z pomocy?
Co to jest pomocnik w Magento?
W jakich przypadkach należy korzystać, a nie korzystać z pomocy?
Odpowiedzi:
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.php
w każdym module i pozostawić go pustym.
Pytanie ma dwa aspekty:
W ogóle, po nazwie klasy Helper
, Util
lub 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 static
nawet functions
bez 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_Abstract
jeś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.
Spożywanie podstawowych pomocników jest czymś, co często będziesz robić.
__()
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 XMLMage::helper('core')
metody: lokalizowanie daty, formowanie ceny i waluty, unikanie i kodowanie danychMage::helper('tax')
metody uzyskiwania informacji z konfiguracji podatkowej i obliczania na ich podstawie cenMage::helper('catalog/image')
zapewnia interfejs do tworzenia buforowanych obrazów o zmienionym rozmiarze i pobierania ich adresów URLMage::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_Compare
który ma $_itemCollection
właściwość, że może zostać zainicjowany tylko raz i $_customerId
wł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/image
Pomocnik 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:
Reader
i Writer
modele, 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 OrderStatusCsvReader
model używany przez OrderStatusUpdater
model. W ten sposób odseparowałem także obawy dotyczące „odczytu danych z pliku” i „kolejności aktualizacji w Magento”
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.
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.
Pomagają zapobiegać powielaniu kodu (w modelach, szablonach, ...), a czasem są po prostu konieczne.
Mage::getStoreConfigFlag('my/module/enabled')
każdy plik, w którym chcesz to sprawdzić, lub korzystasz Mage::helper('my_module')->isEnabled()
z zalet:
isEnabled()
metodę helpers i wpłynie to na wszystkie klasy, które z niej korzystają, zamiast przepisywać kilka plikówMage_Catalog_Model_Product
aby dodać metodę getProductArticles()
. Racja . W swoim pomocniku dodajgetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Możesz po prostu stworzyć pomocnika wywoływanego
Data.php
w każdym module i pozostawić go pustym .
Podczas korzystania z PHPUnit powinieneś dodać jedną linię :protected $_moduleName = 'My_Module';
foreach
pę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ćgetModel
zamiastgetSingleton
, gdybym umieścił go w modelu.