Лучшая практика Magento 2 для локаций и имен классов

15

В Magento 1нас привыкли размещать наши классы в этих каталогах

  • блок
  • помощник
  • модель
  • Ресурс

и используйте простое имя класса без каких-либо заглавных букв в середине имени.

Если мы посмотрим на некоторые случаи в Magento 2 Core

Помощники

Расположение :
- \Foo\Bar\Helper
Имя :
- *.php
Примеры :
- \Magento\ImportExport\Helper\Report
-\Magento\Cms\Helper\Wysiwyg\Images


Наблюдатели

Расположение :
- \Foo\Bar\Observer
Имя :
- *.php
- *Observer.php
Примеры :
- \Magento\CustomerCustomAttributes\Observer\SalesOrderAddressAfterLoad
-\Magento\CustomerBalance\Observer\ProcessBeforeOrderPlaceObserver


Плагины

Расположение :
- \Foo\Bar\Plugin
Имя :
- *.php
- *Plugin.php
Примеры :
- \Magento\Catalog\Plugin\Block\Topmenu
- \Magento\PageCache\Model\App\FrontController\BuiltinPlugin
Источник : http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html#declaring-a-plugin


ConfigProvider

Расположение :
- \Foo\Bar\Model
Имя :
- *ConfigProvider.php
Примеры :
- \Magento\Tax\Model\TaxConfigProvider
-\Magento\Payment\Model\IframeConfigProvider


Мои вопросы:

  • Если есть какие-либо good/ bad/ bestпрактики для этого в Magento 2?
  • Если я хочу создать кастом, DataProviderнапример, что это будет?
    • \Foo\Bar\Provider\CustomDataProvider
    • \Foo\Bar\DataProvider\Custom
    • \Foo\Bar\Model\Provider\CustomDataProvider
    • \Foo\Bar\Helper\Provider\CustomDataProvider
  • Как определить структуру имени и местоположения класса, папки в корне модуля, в Model, в Helper и т. Д.?
  • Зависит ли это от извлеченного источника данных / типа данных?
  • Когда мы должны добавить суффикс к имени класса?


Часть ответа для Virtual Types: https://community.magento.com/t5/Magento-DevBlog/Virtual-Types-Naming-Convention/ba-p/61510

Маттео Джеффри
источник

Ответы:

10

Magento 2 не ограничен Magento 1 только несколькими папками, такими как block, helper, model и так далее.
Вы можете поместить класс в любую папку, которую хотите. Это зависит от вас, поскольку экземпляр класса создается с использованием полного имени класса, а не псевдонимов, как в Magento 1.

Я рекомендую сгруппировать их по функциональности.

  • наблюдатели в Vendor/Module/Observer.
  • плагины в Vendor/Module/Plugin
  • поставщики данных в Vendor/Module/DataProvider.
  • UI компоненты связанных классов в Vendor/Module/Ui

но старайтесь избегать дублирования имен. Я имею в виду Vendor/Module/DataProvider/CustomDataProviderбыло бы излишним.

Возможно, суффикс можно добавить только для интерфейсов, хотя люди будут спорить с этим.

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

С функциональной точки зрения не важно, где вы размещаете классы. Вы даже можете сходить с ума от них и помещать их все прямо в Vendor/Moduleпапку, но вы, вероятно, этого не хотите.

Я думаю (но не полностью уверен), что единственным ограничением является то, что контроллеры должны быть в папке Controller.

Мариус
источник
Я согласен, что мы можем сходить с ума, это хороший и плохой момент, но, как вы сказали, это соответствует нашему взгляду на вещи. Возможно, когда Magento поделится своими внутренними техническими взглядами, как было объявлено на MagentoLive France, у нас будет больше информации по этим вопросам. Спасибо за то, что поделились своим мнением
Matthéo Geoffray
7

Я считаю, что это основано на мнениях, но я согласен, что есть некоторые несоответствия относительно имен классов и местоположений в M2.

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

  • блок
  • контроллер
  • модель
  • наблюдатель
  • Настроить
  • Тестовое задание
  • Ui
  • и т.д
  • i18n
  • Посмотреть
  • Cron
  • помощник
  • Приставка
  • Api
  • Plugin
  • DataProvider

Кроме того, M2 использует несколько очень специфических папок, но я не включил их в этот список:

  • ценообразование
  • Приложение
  • Данные клиентов
  • обслуживание
  • шлюз
  • файлы
  • адаптер
  • Компонент
  • TemplateEngine

Хорошая вещь с M2 - то, что вы можете использовать и создавать любую нужную папку. Если что-то не входит в список выше, создайте свою собственную папку и поместите в нее ваши классы, просто постарайтесь быть последовательными.

Рафаэль в цифровом пианизме
источник
Во всех ваших ответах мы находим одну и ту же идею, возможность делать то, что мы хотим, и самое главное - оставаться последовательным и регулярным в построении. Однако было бы замечательно, чтобы Magento поделилась некоторыми внутренними взглядами на это, как они объявили ML. Как вы сказали, всем будет легче понять расширения ядра и сообщества. Спасибо за Ваш ответ.
Маттео Джеффри
6

Я думаю, что главным приоритетом должно быть сделать код максимально самодокументированным . Так что вместо того, чтобы помещать все в каталоги Model или Helper, лучше найти хорошее имя, которое описывает, что делает код под ним. Конечно, это также сложнее, потому что требует гораздо больше размышлений.

Например, вместо использования Model/Config/Converter.phpимя OrderStateMachine/TransitionsConfiguration/XmlToArrayConverter.phpговорит гораздо больше о том, что делает модуль и класс.

Vinai
источник
Как вы сказали, это требует больше размышлений, чтобы прояснить это для нас, но также и для любого, кто видит расширение. Это делает вещи сложнее в данный момент, но более эффективно со временем. Спасибо за ваш ответ
Matthéo Geoffray
3

Уже есть несколько действительно хороших ответов. Я хотел бы добавить, что вы должны избегать размещения кода под app/codeи вместо этого использовать метод установки, основанный на композиторе, который в конечном итоге поместит ваш код под vendor/.

Кристоф в Фуман
источник
Да, не волнуйтесь, я знаю об этом, формат только для примера в моем вопросе :) Но вы правы для людей, которые не знают, что я буду редактировать, чтобы прояснить это. Спасибо
Matthéo Geoffray
что является хорошей отправной точкой fooman
Amit Бера