Що є помічником у Magento?
У яких випадках слід використовувати, а не використовувати помічники?
Що є помічником у Magento?
У яких випадках слід використовувати, а не використовувати помічники?
Відповіді:
Теоретично ніколи не слід використовувати помічників.
Помічники - це лише сукупність споріднених методів і завжди інстанціюються як одинаки.
Це в основному процедурне програмування з функціями, згрупованими під деяким простором імен (назва класу в цьому випадку). Але оскільки у Magento є помічники в основі, ви можете помістити свої методи туди, що ви не знаєте, куди їх розміщувати, або якщо вам потрібно зателефонувати їм у багатьох різних місцях (моделі, контролери, шаблони)
Використовуйте їх в крайньому випадку.
Також Magento вимагає помічника для кожного модуля з міркувань перекладу.
Ви можете просто створити помічник, який називається Data.php
у кожному модулі, і залишити його порожнім.
Питання має два аспекти:
Загалом, то , класи по імені 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, помічник модулів часто досить хороший для подібних речей.
Споживання основних помічників - це те, що ви будете робити досить часто.
__()
метод перекладу: щоб отримати переклад певного модуля, слід скористатися Mage::helper('module-alias')->__('string to be translated')
. Це відбувається неявно, якщо ви використовуєте $this->__(...)
в шаблоні або блоці і якщо ви використовуєте translate="..."
атрибут у файлах XMLMage::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:
Reader
і Writer
моделей, які на насправді зробити є стан ( по крайней мере, файловий ресурс). Наприклад, для читання даних про стан замовлення з CSV-файлу я мав би що-небудь. Lika - OrderStatusCsvReader
модель, яка використовується OrderStatusUpdater
моделлю. Таким чином я також відокремлюю занепокоєння "читати дані з файлу" та "Порядок оновлення в Magento"
Маріус правий. Я думаю, що помічники - це нісенітниця.
Але в теорії magento ви повинні вкласти все в помічники, що не змінює стан об'єкта, наприклад, отримати форматизовану ціну.
Але все, що ви можете поставити в помічник, ви можете вкласти і в модель. І ви можете отримати різні екземпляри моделі, що корисно для тестування.
Я зовсім новачок у Magento, але мені здається, що помічник - це еквівалент послуги Magento : "набір відповідних функціональних програм, які можна використовувати повторно для різних цілей". Модуль експортує запропоновану функціональність через сервіси. Використовуйте помічник для функцій, які ви запрошуєте до використання інші модулі.
Модель повинна передбачати лише методи, безпосередньо пов'язані з отриманням або встановленням стану об'єкта, або які іншим чином пов'язані з інстанційним об'єктом моделі.
Допомагає корисно запобігати дублюванню коду (у моделях, шаблонах, ...), а колись вони просто необхідні.
Mage::getStoreConfigFlag('my/module/enabled')
до кожного файлу, де ви хочете перевірити це, або ви використовуєте Mage::helper('my_module')->isEnabled()
з перевагами:
isEnabled()
метод помічників, і це вплине на всі класи, які його використовують, замість того, щоб переписувати кілька файлів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';
foreach
циклі і всілякі божевілля. Я виявив, що повторюю цю страшну логіку для помічника і використовую її як кеш-пам'ять об'єкта, і залишив мало місця для помилок майбутніх розробників, які, можливо, випадково зателефонувалиgetModel
замість того,getSingleton
якби я розмістив її в моделі.