Что такое помощник в Magento?

22

Что такое помощник в Magento?

В каких случаях следует использовать, а не использовать помощников?

сверхзвуковой
источник

Ответы:

27

Теоретически вы никогда не должны использовать помощников.
Помощники - это просто наборы несвязанных методов и всегда создаются как одиночные экземпляры.
Это в основном процедурное программирование с функциями, сгруппированными в некотором пространстве имен (имя класса в данном случае). Но так как в Magento есть помощники в ядре, вы можете поместить свои методы туда, чтобы вы не знали, куда их поместить или если вам нужно вызывать их во многих разных местах (модели, контроллеры, шаблоны)

Используйте их как последнее средство.

Также Magento требует помощника для каждого модуля по причинам перевода.
Вы можете просто создать помощник, вызываемый Data.phpв каждом модуле, и оставить его пустым.

Мариус
источник
Единственное реальное «применение», которое я нашел для помощников, заключается в том, что они гарантированно всегда будут одиночками. Я работал на каком - то учебном унаследованного кода , который загружал коллекции внутри foreachпетель и всякие безумства. Я обнаружил, что реструктурирование этой ужасающей логики для помощника и использование ее в качестве кеша объектов было полезным и оставило мало места для ошибок от будущих разработчиков, которые могли бы случайно вызвать getModelвместо того, getSingletonчтобы поместить их в модель.
Люк Роджерс
@LukeRodgers. Я понимаю вашу точку зрения, но я не думаю, что «случайный вызов getModel вместо getSingleton» может рассматриваться как реальная причина для использования помощников. Я могу утверждать, что вы можете «случайно» вызвать «удалить» вместо «сохранить». Какую защиту вы можете сделать, чтобы избежать этого? Я полагаю, что «уделять внимание» является частью разработки программного обеспечения.
Мариус
Согласовано. В этих сценариях, я думаю, я просто пытаюсь защищаться от человечества.
Люк Роджерс
Как бы вы добавили пользовательские методы в основные помощники?
Tecjam
13

Вопрос имеет два аспекта:

  1. Должен ли я написать своих собственных помощников и зачем?
  2. Должен ли я использовать основные помощники и для чего?

1. Написание помощников

В общем, то , классы по имени Helper, Utilили подобное просто говорит : « У меня есть некоторые функции , которые я не знаю , куда девать» , и не имеет особого смысла , так как класс.

Magento создает экземпляры помощников как синглтоны, и большинство основных помощников не имеют никакого состояния, поэтому методы могут быть как с классом, так staticи functionsбез него. Все это часто считается запахом кода , недостатком в дизайне приложения.

Как уже указывал Мариус, вам не нужно использовать помощники для собственного кода. Просто создайте по умолчанию пустой помощник для модуля, если вы используете специфичные для модуля переводы, иначе они не будут работать. Предпочитают модели (которые не нужно расширять, Mage_Core_Model_Abstractесли они не представляют данные базы данных) или классы независимых библиотек.

Тем не менее, я бы не стал слишком строго относиться к тому, чтобы «вообще не использовать помощников», а вместо этого использовать их для ярлыков запросов, таких как:

  • конфигурация модуля доступа:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • фабричные методы для библиотечных классов

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

Вы могли бы найти другие места, но имхо, помощник модуля часто достаточно хорош для подобных вещей.


2. Использование помощников

Потребление основных помощников - это то, что вы будете делать довольно часто.

Примеры:

  • __()метод перевода: чтобы получить перевод определенного модуля, вы должны использовать Mage::helper('module-alias')->__('string to be translated'). Это происходит неявно, если вы используете $this->__(...)внутри шаблона или блока, и если вы используете translate="..."атрибут в файлах XML
  • Mage::helper('core') методы: локализованная дата, цена и форматирование валюты, экранирование и кодирование данных
  • Mage::helper('tax') методы получения информации из налоговой конфигурации и расчета цен на основе этого
  • Mage::helper('catalog/image') предоставляет интерфейс для создания кэшированных и измененных размеров каталожных изображений и получения их URL
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() соединяет таблицу перезаписи URL с запросом к коллекции продуктов.

В основных помощниках скрыто много других (более или менее) полезных функций. Если вам нужна определенная функциональность, которая, вероятно, будет использоваться где-то в ядре, проверьте, можете ли вы использовать вспомогательный метод.

Обычно эти помощники являются объектами без состояния, а методы - методами запросов (т.е. они не имеют побочных эффектов)

Но, как всегда, Magento нарушает свои неписаные правила и не должен рассматриваться как пример. «Хороший» пример того, как не использовать помощники, - Mage_Catalog_Helper_Product_Compareэто $_itemCollectionсвойство, которое можно инициализировать только один раз, и $_customerIdсвойство, которое можно изменить с помощью установщика. Вы найдете еще несколько помощников, связанных с каталогом с прикрепленными коллекциями. Написание тестов для кода, который использует их или повторно использует их в другом контексте, не очень весело, поэтому, пожалуйста, не делайте этого дома.

catalog/imageПомощник упоминалось выше , является еще одним примером помощника , который действительно не должен быть помощником. Вам нужно init()сначала передать продукт, который сбрасывает его текущее состояние, затем вы устанавливаете различные параметры (например resize(), setQuality()), и в конце вы можете получить URL с помощью его __toString()метода. Это выглядит хорошо, когда используется в шаблоне, но код представляет собой огромный беспорядок, и он не имеет смысла как одиночка.


TL; DR:

  • Основные помощники содержат полезные инструменты.
  • Вам нужны помощники для перевода
  • Помощники должны быть без гражданства
  • В своих собственных модулях избегайте использования помощников в качестве наборов различных функций. В большинстве случаев вы можете найти более подходящее место
Фабиан Шменглер
источник
Я часто использовал помощников в простых интеграциях ERP, основанных на плоских файлах. Все, что они делают, это пишут и читают файлы из локальных каталогов и обновляют другие объекты (продукт, заказ и т. Д.). Они не имеют состояний или соответствующих собственных таблиц в упомянутых случаях. Что вы думаете об этом?
musicliftsme
1
Это нарушает «никаких побочных эффектов». Мое обычное взятие на чтение и запись файлов Readerи Writerмоделей, которые на самом деле сделать есть состояние ( по крайней мере, файловый ресурс). Например, для чтения данных о состоянии заказа из файла CSV у меня будет sth. Лика OrderStatusCsvReaderмодель, которая используется OrderStatusUpdaterмоделью. Таким образом, я также разделяю проблемы «чтение данных из файла» и «порядок обновления в Magento»
Фабиан Шменглер
4

Мариус прав. Я думаю, что помощники это чепуха.

Но в теории маженто вы должны поместить все в помощники, которые не изменяют состояние объекта, например, получить отформатированную цену.

Но все, что вы можете поместить в помощника, вы можете положить и в модель. И вы можете получить различные экземпляры модели, что полезно для тестирования.

Фабиан Блехшмидт
источник
2

Я довольно новичок в Magento, но для меня это выглядит так, как будто Helper - это эквивалент сервиса Magento : «набор связанных программных функций, которые можно повторно использовать для различных целей». Модуль экспортирует свою предлагаемую функциональность через сервисы. Используйте помощника для функций, которые вы предлагаете использовать другим модулям.

Модель должна предоставлять только методы, которые напрямую связаны с получением или установкой состояния объекта или иным образом связаны с созданным объектом модели.

Патрик ван Берген
источник
1

Помощь полезна для предотвращения дублирования кода (в моделях, шаблонах, ...), а иногда они просто необходимы.

  • чтобы проверить, включен ли ваш пользовательский модуль, вы можете поместить что-то вроде Mage::getStoreConfigFlag('my/module/enabled')каждого файла, где вы хотите это проверить, или вы используете Mage::helper('my_module')->isEnabled()с преимуществами:
    • если по какой-то причине путь конфигурации меняется, вам просто нужно настроить один файл
    • Вы можете переписать isEnabled()метод helpers, и он повлияет на все классы, которые его используют, вместо перезаписи нескольких файлов.
  • 13th @ Как написать собственное расширение? : Не переписывайте классы, если в этом нет необходимости. Используйте наблюдатели, и если невозможно использовать вспомогательные методы, которые получают в качестве параметра и экземпляра класса, который вы хотите переопределить. Неверно: переопределить, Mage_Catalog_Model_Productчтобы добавить метод getProductArticles(). Верно . В свой помощник добавьgetProductArticles(Mage_Catalog_Model_Product $product)
  • сделать обновления макета более гибкими, используя <action method="someMethod"><var helper="module/method" /></action>

Вы можете просто создать помощник, вызываемый Data.phpв каждом модуле, и оставить его пустым .

При использовании PHPUnit вы должны добавить одну строку :protected $_moduleName = 'My_Module';

sv3n
источник