Що є помічником у 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(...);
    }

Ви можете знайти інші місця, окрім IMHO, помічник модулів часто досить хороший для подібних речей.


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-адреси до запиту колекції продукту.

Існує багато інших (більш-менш) корисних функцій, прихованих у основних допоміжних програмах, якщо вам потрібна певна функціональність, яка, ймовірно, десь буде використана в ядрі, перевірте, чи можете ви повторно використовувати хелперний метод.

Зазвичай ці помічники є об'єктами без громадянства, а методи - це методи запиту (тобто вони не мають побічних ефектів)

Але як завжди Мадженто порушує власні неписані правила, і його не слід брати за приклад. "Гарний" приклад того, як не використовувати помічників, Mage_Catalog_Helper_Product_Compareмає $_itemCollectionвластивість, яку можна ініціалізувати лише один раз, і $_customerIdвластивість, яку можна змінити за допомогою сетера. Ви знайдете ще кілька помічників, пов’язаних із каталогом, із доданими колекціями. Написання тестів на код, який використовує їх або повторно використовувати їх в іншому контексті, не цікаво, тому, будь ласка, не робіть цього вдома.

Згаданий catalog/imageвище помічник - ще один приклад помічника, який насправді не повинен бути помічником. Вам потрібно передати продукт init()спочатку, який скидає його поточний стан, потім ви встановите різні параметри (наприклад resize(), setQuality()), і в кінцевому підсумку ви можете отримати URL-адресу з його __toString()методом. Це виглядає приємно при використанні в шаблоні, але код - це безлад, і він не має сенсу як синглтон.


TL; DR:

  • Основні помічники містять корисні інструменти.
  • Вам потрібні помічники для перекладу
  • Помічники повинні бути без громадянства
  • У власних модулях уникайте використання помічників як колекцій різноманітних функцій. У більшості випадків ви можете знайти більш підходяще місце

Я часто використовував помічників у простих ERP-інтеграціях на основі плоских файлів. Вони лише записують та читають файли з локальних каталогів та оновлюють інші об’єкти (продукт, замовлення тощо). У вказаних випадках вони не мають держав або відповідних власних таблиць. Що ти береш за це?
musicliftsme

1
Це порушує "відсутність побічних ефектів". Моє звичайне взяття на читання і запис файлів Readerі Writerмоделей, які на насправді зробити є стан ( по крайней мере, файловий ресурс). Наприклад, для читання даних про стан замовлення з CSV-файлу я мав би що-небудь. Lika - OrderStatusCsvReaderмодель, яка використовується OrderStatusUpdaterмоделлю. Таким чином я також відокремлюю занепокоєння "читати дані з файлу" та "Порядок оновлення в Magento"
Фабіан Шменглер

4

Маріус правий. Я думаю, що помічники - це нісенітниця.

Але в теорії magento ви повинні вкласти все в помічники, що не змінює стан об'єкта, наприклад, отримати форматизовану ціну.

Але все, що ви можете поставити в помічник, ви можете вкласти і в модель. І ви можете отримати різні екземпляри моделі, що корисно для тестування.


2

Я зовсім новачок у Magento, але мені здається, що помічник - це еквівалент послуги Magento : "набір відповідних функціональних програм, які можна використовувати повторно для різних цілей". Модуль експортує запропоновану функціональність через сервіси. Використовуйте помічник для функцій, які ви запрошуєте до використання інші модулі.

Модель повинна передбачати лише методи, безпосередньо пов'язані з отриманням або встановленням стану об'єкта, або які іншим чином пов'язані з інстанційним об'єктом моделі.


1

Допомагає корисно запобігати дублюванню коду (у моделях, шаблонах, ...), а колись вони просто необхідні.

  • щоб перевірити, чи увімкнено спеціальний модуль, ви можете розмістити щось подібне Mage::getStoreConfigFlag('my/module/enabled')до кожного файлу, де ви хочете перевірити це, або ви використовуєте Mage::helper('my_module')->isEnabled()з перевагами:
    • якщо тобто конфігураційний шлях чомусь змінюється, вам просто доведеться відрегулювати один файл
    • ви можете переписати isEnabled()метод помічників, і це вплине на всі класи, які його використовують, замість того, щоб переписувати кілька файлів
  • 13-й @ Як написати розширення? : Не переписуйте класи, якщо це не потрібно. Використовуйте спостерігачі, і якщо це неможливо використовувати допоміжні методи, які отримують як параметр і екземпляр класу, який ви хотіли переотримати. Неправильно: Замініть, 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';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.