Деякі з кращих практик при роботі з Magento 2

Magento є однією з провідних платформ для електронної комерції в світі. І її використовують більшість великих світових брендів, тому що вона гнучка, надійна і відкрита. Magento має широкий спектр вбудованих функцій, високу масштабованість, вона постійно розвивається.

У сьогоднішній статті ми розглянемо рекомендації, які засновані на кращих практиках при розробці на Magento. Ці рекомендації допоможуть як новачкам, так і більш досвідченим розробникам Magento 2.

 

 

Враховуйте стандарти кодування

Завжди дотримуйтесь стандартів кодування і ніколи не редагуйте системні файли, оскільки це може призвести до порушення в роботі платформи. У вас може бути спокуса зробити все швидко, але в цьому випадку ваша робота буде недостатньо якісною, і в майбутньому може принести шкоду.

Дотримуючись стандартних угод, ви надаєте своєму кодові професійний вид і полегшуєте його читання. Переконайтеся, що ваші стандарти кодування Magento засновані на стандартах кодування Zend, PSR1, PSR2 і PSR4.

 

 

Поради при розробці модуля

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

Вам завжди потрібно створювати новий модуль для будь-якої функціональності, але перед цим ви повинні бути впевнені, що для цього дійсно потрібен новий модуль. Замість того, щоб розробляти новий модуль з нуля, ви можете використовувати системний код і перевизначити його відповідно до ваших вимог, що заощадить вам масу часу і клопоту. Також при перевизначенні ядра переконайтеся, що ви переписуєте тільки потрібний код, а новий клас розширює вихідний основний клас.



При розробці будь-якого модуля ви повинні дотримуватися угоди про іменування. Враховуйте це при іменуванні файлів, папок, методів і класів.

Якщо ви не знаєте, як щось зробити, подивіться на вихідний код Magento. Цей код досить часто є джерелом натхнення.

 

 

Розуміння фреймворка Magento 2

У порівнянні з Magento 1 в новій платформі відбулися значні зміни. Обов’язково вивчіть можливості і стандарти платформи Magento 2. Нижче наведені лише деякі з важливих особливостей:

  • Замість створення нових користувальницьких валідаторів, реалізуйте \Magento\Framework\Validator\ValidatorInterface.
  • Створення з’єднання з базою даних може бути витратним і непотрібним. Magento надає моделі ресурсів для виконання SQL команд (зверніть увагу на Persistence Layer – Шар зберігання).
  • Подумайте про використання угод фреймворка Magento замість низькорівневих або PHP-функцій.
  • Використовуйте клас Magento\Framework\Data\Collection для отримання колекції відфільтрованих об’єктів замість безпосереднього запиту до бази даних.

 

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

Завжди використовуйте git для створення версій свого коду, використовуйте локальну віртуальну машину для розробки (Vagrant або Docker можуть бути хорошими інструментами).

 

 

Створюйте код, який можна використовувати повторно

Уникайте використання надлишкового або дубльованого коду, який може бути важко підтримувати. Замість того, щоб копіювати і вставляти один і той же код, створіть окремий клас або метод і посилайтеся на нього при необхідності. Переконайтеся, що ви використовуєте корисний код якомога частіше.

Код, який ви пишете, повинен бути невеликим, цілеспрямованим і забезпечувати спільне рішення. Це дозволить вам повторно використовувати цю функціональність в майбутньому.

 

 

Уникайте створення допоміжних (helper) класів

Допоміжні або службові класи – це класи, заповнені статичними методами, які мало де застосовуються. Ці класи вважаються анти-патернами і суперечать принципам об’єктно-орієнтованого програмування. Якщо у вас є SomeClass і SomeClassHelper зі статичними функціями, які працюють з SomeClass, ви повинні розглянути можливість рефакторинга цих функцій в SomeClass.

Допоміжний клас, який функціонує як універсальний засіб для випадкових методів, порушує принцип єдиної відповідальності, тому що це спроба вирішити кілька проблем в одному класі. Ви повинні переписати свій код і перемістити ці функції в відповідні класи, з якими вони повинні працювати.

 

 

Поради по перевизначенню спостерігача (observer)

Спостерігачі можуть змінювати поведінку додатка Magento, оскільки вони динамічно впроваджуються в потік виконання. Погано спроектовані і закодовані спостерігачі можуть викликати проблеми, нестабільність або іншим чином порушувати роботу додатка.

Як зробити спостерігач ефективним:

  • Намагайтеся, щоб ваш спостерігач був маленьким і ефективним, уникаючи складних обчислень, якщо це можливо. Це особливо важливо, коли ваш спостерігач слухає подію, яка часто надсилається. Складні обчислення в вашому спостерігачі можуть уповільнити процеси додатка.
  • Не вмикайте бізнес-логіку. Ваш спостерігач не повинен містити логіку, крім тієї, яка необхідна для його роботи. Бізнес-логіка повинна бути розміщена в інших класах, які використовує ваш спостерігач.
  • Оголошуйте спостерігача у відповідній області видимості. Зробіть свого спостерігача настільки конкретним, наскільки це необхідно. Це означає, що якщо ваш спостерігач має справу тільки з зовнішніми подіями, ви повинні оголосити свого спостерігача в файлі /etc/frontend/events.xml замість глобального файлу /etc/events.xml.
  • Уникайте замкнутих циклів подій. Циклічні події відбуваються, коли ваш спостерігач викликає метод об’єкта, який відправляє подію, що запускає ланцюжок подій, що в кінцевому підсумку відправляє ту ж початкову подію, яку виконує ваш спостерігач повторюваним чином. Переконайтеся, що ваш спостерігач не відправляє подію, яку він негайно слухає або буде слухати наступним ланцюжком подій.
  • Не покладайтеся на порядок виклику. Ваш спостерігач не повинен робити припущень щодо порядку, в якому він буде викликатися, і не повинен покладатися на виконання іншого спостерігача. Спостерігачі, які слухають одну й ту ж подію, можуть викликатися в будь-якому порядку, коли ця подія відправляється.

 

 

Макет XML

У платформі відбулися серйозні оновлення у визначенні макетів, щоб обмежити зміни, які ви можете робити в файлах шаблонів (які були можливі в попередній версії). Були додані нові теги container, referenceBlock, referenceContainer, move, update і argument.

Ось приклад батьківського і дочірнього контейнерів:

...  <container name="div.sidebar.additional" htmlTag="div" htmlClass="sidebar sidebar-additional" after="div.sidebar.main">    <container name="sidebar.additional" as="sidebar_additional" label="Sidebar Additional"/>  </container>  ...  

 

Доступ до значень аргументів, встановленим у файлі макета, можна отримати в шаблонах за допомогою методів get{ArgumentName}() і has{ArgumentName}(). Останній повертає логічне значення, що визначає, чи є якесь встановлене значення. {ArgumentName} виходить з атрибута name наступним чином: для отримання значення імені методу використовується getSomeString().

Встановлення значення css_class в файлі макета додатка /code/Magento/Theme/view/frontend/layout/default.xml:

...  <arguments>    <argument name="css_class" xsi:type="string">header links</argument>  </arguments>  ...  

 

 

Отримання значення css_class в app/code/Magento/Theme/view/frontend/templates/html/title.phtml:

...  $cssClass = $this->getCssClass() ? ' ' . $this->getCssClass() : '';  ...  

 

 

Рекомендується не змінювати базові файли дизайну, а замість цього слідувати стандартам кодування і розширювати або перевизначати макет для будь-якої модифікації.

  • Розширити макет. Замість того, щоб копіювати великий макет сторінки або код конфігурації сторінки, а потім змінювати те, що ви хочете змінити, в системі Magento вам потрібно всього лише створити розширений файл макета, що містить необхідні зміни. Наприклад, щоб налаштувати макет, визначений у /view/frontend/layout/catalog_product_view.xml, вам потрібно додати файл макета з тим же ім’ям в свою користувацьку тему, наприклад: /Magento_Catalog/layout/catalog_product_view.xml
  • Перевизначити макет. Не всі налаштування макета можуть бути виконані шляхом розширення існуючих макетів. Якщо кількість налаштувань велике, ви можете використовувати функцію перевизначення для потрібного файлу макета. Це означає, що новий файл, який ви розміщуєте в темі, буде використовуватися замість файлу макета батьківської теми файлу базового макета.

 

 

Очищення кешу

Якщо ви забудете очистити або відключити кешування, це може викликати головний біль при розробці. Рекомендується очищати кеш перед виконанням візуальної перевірки вашої теми, щоб переконатися, що відображуваний вміст коректний.

Поки ви розробляєте компоненти Magento (модулі, теми і мовні пакети), ваше швидко змінюване середовище вимагає від вас періодично очищати певні каталоги і кеші. В іншому випадку ваш код не буде працювати належним чином.

Слідуйте цим важливим вказівкам про те, коли і як очищати певні каталоги кеша. Переконайтеся, що ви перебуваєте в кореневому каталозі вашої інсталяції Magento.

Щоб очистити тільки каталоги і не виконувати інші дії, увійдіть на сервер Magento як власник файлової системи Magento і очистіть каталоги за допомогою команди, подібної наступній.

rm -rf /var/di/* /var/generation/*  

 

Для оновлення бази даних і схеми всякий раз, коли відбуваються зміни в класі або зміни, що призводять до генерації фабрик, зміни в будь-якому файлі di.xml або додаванню/видаленню будь-якого модуля, запускайте наступну команду. Вона очистить ці каталоги: var/di, var/generation.

php bin/magento setup:upgrade  

 

Після виконання вищевказаної команди необхідно згенерувати скомпільований код:

php bin/magento setup:di:compile  

 

 

Після запуску будь-якої з вищевказаних команд, щоб відобразити останні зміни, необхідно очистити кеш за допомогою наступної команди:

php bin/magento setup:static-content:deploy -f  

 

Щоб відобразити останні зміни на CMS сторінці, в кешованому блоці або змінити конфігурацію в адмінці, необхідно виконати наступну команду:

php bin/magento cache:clean  

 

 

 

Ось і все, дякуємо за увагу!