Некоторые из лучших практик при работе с 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
Вот и все, спасибо за внимание!