Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Cheat Sheet: All 32 Module Areas at a Glance

Cheat Sheet: All 32 Module Areas at a Glance

~7 Min. Lesezeit Zuletzt aktualisiert am August 9, 2026

No new content anymore - just condensation. This chapter is the one page to come back to in your own practice when the question is "which chapter was it again that showed how...": first the complete, final file tree of the module after all twelve blocks, then all 32 areas with their chapter reference, in the same order as the project specification.

The complete file tree

The complete Mironsoft_Loyalty file tree after all 12 blocks (106 chapters)

app/code/Mironsoft/Loyalty/
├── registration.php                                          (chapter 2)
├── etc/
│   ├── module.xml                                            (chapters 2/11/19/20/22, sequence)
│   ├── acl.xml                                               (chapters 6/9/16/80)
│   ├── di.xml                                                (chapters 6/38/39/41/62/79/86/88)
│   ├── events.xml                                            (chapters 30/31/63/76)
│   ├── crontab.xml                                           (chapter 32)
│   ├── cache.xml                                             (chapter 8)
│   ├── config.xml                                            (chapters 7/32/62/66)
│   ├── db_schema.xml                                         (chapters 3/11/63)
│   ├── extension_attributes.xml                              (chapters 22/79)
│   ├── payment.xml                                           (chapter 62)
│   ├── product_types.xml                                     (chapter 72)
│   ├── webapi.xml                                            (chapters 80/81)
│   ├── widget.xml                                            (chapters 56/57)
│   ├── schema.graphqls                                       (chapters 82/83)
│   ├── adminhtml/system.xml                                  (chapters 7/32)
│   ├── frontend/routes.xml                                   (chapter 46)
│   ├── frontend/di.xml                                       (chapter 46)
│   ├── frontend/sections.xml                                 (chapter 84)
│   └── pagebuilder/content_type.xml                          (chapter 59)
├── Api/
│   ├── PointsLedgerRepositoryInterface.php                   (chapter 6)
│   ├── PointsManagementInterface.php                         (chapter 80)
│   ├── RewardRepositoryInterface.php                         (chapter 79)
│   ├── RewardRedemptionManagementInterface.php               (chapter 81)
│   └── Data/ (PointsLedger/PointsSummary/Reward/RewardSearchResults/RewardRedemptionResult interfaces)
├── Block/PageBuilder/PointsBanner.php                        (chapter 59)
├── Console/Command/RecalculatePointsCommand.php              (chapter 9)
├── Controller/
│   ├── Router.php                                           (chapter 46)
│   ├── History/Index.php                                    (chapter 45)
│   ├── Catalog/Index.php, Catalog/View.php                   (chapter 49)
│   ├── Redeem/Index.php                                     (chapter 50)
│   ├── Ajax/ApplyPoints.php                                  (chapter 63)
│   └── Adminhtml/Reward/Index.php                           (chapter 16)
├── Cron/ExpirePoints.php                                    (chapter 33)
├── CustomerData/PointsBalance.php                           (chapter 84)
├── Helper/EmailPointsHelper.php                             (chapter 44)
├── i18n/de_DE.csv, en_US.csv                                (chapters 89/90)
├── Logger/Logger.php, Handler.php                           (chapter 34)
├── Model/
│   ├── PointsLedger.php, PointsLedgerRepository.php         (chapters 4/6)
│   ├── Reward.php, RewardRepository.php, Data/Reward.php    (chapters 12/79)
│   ├── PointsManagement.php                                 (chapter 80)
│   ├── RewardRedemptionManagement.php                       (chapter 81)
│   ├── Cache/Type/LoyaltyCatalog.php                        (chapter 8)
│   ├── Carrier/FreeShippingByPoints.php                     (chapters 66/67)
│   ├── Config/LoyaltyConfig.php                             (chapter 7)
│   ├── Config/LoyaltyFeatureFlagsConfigType.php + Source/   (chapter 88)
│   ├── Customer/Attribute/Backend/LoyaltyTierBackend.php    (chapters 26/35)
│   ├── Erp/CompanyMultiplierPreference.php                  (chapter 41)
│   ├── Payment/PointsRedemptionConfigProvider.php + AvailabilityHandler.php (chapters 62/64)
│   ├── Product/Type/PointsPackage.php + Price.php           (chapter 73)
│   ├── RateLimiter/RedemptionRateLimiter.php                (chapter 86)
│   ├── Resolver/PointsSummary.php, RewardCatalog.php, RedeemLoyaltyReward.php, DataProvider/RewardCatalog.php (chapters 82/83)
│   ├── ResourceModel/PointsLedger(/Collection).php          (chapters 4/31)
│   ├── ResourceModel/Reward(/Collection).php                (chapters 12/15)
│   ├── Reward/Source/RewardType.php                         (chapter 14)
│   ├── Service/PointsCalculator.php                         (chapter 5)
│   ├── Service/CategoryBonusResolver.php                    (chapter 27)
│   ├── Source/LoyaltyTier.php                               (chapter 24)
│   ├── Util/PointsFormatter.php                             (chapter 44)
│   └── Widget/PointsBalanceWidget.php                       (chapters 56/57)
├── Observer/
│   ├── AwardPointsOnOrderPlaced.php                         (chapter 30)
│   ├── ReversePointsOnCreditmemoSave.php                    (chapter 31)
│   ├── RedeemPointsOnOrderPlaced.php                        (chapters 63/67)
│   └── CreditPurchasedPointsPackageOnOrderPlaced.php        (chapter 76)
├── Plugin/
│   ├── PointsLedger/Validate.../Cache.../LimitLedgerListResultPlugin.php (chapter 38)
│   ├── Checkout/ApplyPointsRedemptionToTotalsPlugin.php     (chapter 39)
│   ├── Company/AddLoyaltyTierOverridePlugin.php             (chapter 22)
│   └── Api/ThrottleRewardRedemptionPlugin.php               (chapter 86)
├── Setup/Patch/Data/ (12 patches, dependency graph in chapter 99)
├── Test/Unit/... , Test/Integration/...                     (chapters 91-93)
├── ViewModel/PointsBalance.php, PointsHistory.php, RewardCatalog.php, RewardDetail.php (chapters 47-50)
├── view/adminhtml/ (ui_component/*, web/js+template/content-type/points-banner/*) (chapters 16/22/59/60/74)
└── view/frontend/ (layout/*, templates/*, web/js+template/payment/*)          (chapters 46/51-53/57/59/65/75/84)

app/etc/loyalty_flags.php                                     (chapter 88, outside the module)
.gitlab-ci.yml                                                (chapter 95, project root)

All 32 areas with their chapter reference

  • Api - chapters 79-81
  • Block - chapter 47
  • Cache - chapter 8
  • Category attribute - chapter 20
  • Company attribute - chapter 22
  • Configuration type - chapter 88
  • Console command - chapter 9
  • Controller - chapters 45, 50
  • Cron group - chapter 32
  • Cron job - chapter 33
  • Customer attribute - chapter 21
  • Customer (section) data - chapter 84
  • EAV entity - chapters 10-18
  • EAV attribute (custom) - chapters 13-14
  • GraphQL endpoint - chapters 82-83
  • Helper - chapter 44
  • Language - chapters 89-90
  • Model - chapter 4
  • Observer/event - chapters 29-31, 35-36
  • Page Builder content type - chapters 58-60
  • Payment method - chapters 62-65
  • Plugin - chapters 38-39
  • Preference/rewrite - chapters 40-42
  • Product attribute - chapter 19
  • Product type - chapters 71-78
  • Router - chapter 46
  • Sales attribute - chapter 23
  • Shipping method - chapters 66-69
  • System/config/setting - chapter 7
  • Unit test - chapters 91-95
  • View model - chapter 48
  • Widget - chapters 55-57

The ten recurring patterns of this series

  1. Service contract instead of helper - every core action runs through an interface (PointsLedgerRepositoryInterface, RewardRepositoryInterface, PointsManagementInterface, RewardRedemptionManagementInterface).
  2. View model instead of block - except where Magento forces a fixed base class (widget, Page Builder content type, payment/shipping method blocks, product type).
  3. addFieldToFilter() and addAttributeToFilter() always in array form, never with a bare scalar.
  4. CustomerRepositoryInterface::getCustomAttribute()/setCustomAttribute() instead of getData()/setData() for every balance change.
  5. try/catch (\Throwable) around every sales_order_place_after observer, so a failure never crashes the checkout request itself.
  6. Should-be-vs-is reconciliation instead of direct counters, everywhere the same event can fire more than once (credit memo saves, cron re-runs).
  7. module.xml sequence extended only where a schema or data patch actually touches a foreign table - never blanket-added for every runtime integration.
  8. One service contract, three surfaces - storefront, REST, and GraphQL call the same implementation, never three parallel copies of the same logic.
  9. Deliberately documented, unfixed residual risks (race conditions) instead of silently ignored gaps.
  10. PHPDoc on every class and method, declare(strict_types=1), constructor property promotion - without exception, across all 106 chapters.

With this cheat sheet in hand, only one chapter remains - the conclusion of this 106-chapter series.