Understanding Platform Architecture

Branko Ajzele

December 2015

In this article by Branko Ajzele, author of the book Magento 2 Developers Guide, we will be introduced to Magento, and will go through its platform architecture.

Magento is a powerful, highly scalable, and highly customizable e-commerce platform that can be used to build web shops and, if needed, some non-e-commerce sites. It provides a large number of e-commerce features out of the box.

(For more resources related to this topic, see here.)

Features such as product inventory, shopping cart, support for numerous payment and shipment methods, promotion rules, content management, multiple currencies, multiple languages, multiple websites, and so on make it a great choice for merchants. On the other hand, developers enjoy the full set of merchant-relevant features plus all the things related to actual development. In this article, a high-level overview of Magento is provided in the following sections:

  • The technology stack
  • The architectural layers
  • The top-level filesystem structure

The technology stack

Magento's highly modular structure is a result of several open source technologies embedded into a stack. These open source technologies are composed of the following components:

  • PHP: PHP is a server-side scripting language.
  • Coding standards: Magento puts a lot of emphasis on coding standards. These include PSR-0 (the autoloading standard), PSR-1 (the basic coding standards), PSR-2 (the coding style guide), PSR-3, and PSR-4.
  • Composer: Composer is a dependency management package for PHP. It is used to pull in all the vendor library requirements.
  • HTML: HTML5 is supported out of the box.
  • CSS: Magento supports CSS3 via its in-built LESS CSS preprocessor.
  • jQuery: jQuery is a mature cross-platform JavaScript library that was designed to simplify the DOM manipulation. It is one of the most popular JavaScript frameworks today.
  • RequireJS: RequireJS is a JavaScript file and module loader. Using a modular script loader such as RequireJS helps improve the speed and quality of code.
  • Third-party libraries: Magento comes packed with lot of third-party libraries, with the most notable ones being Zend Framework and Symfony. It is worth noting that Zend Framework comes in two different major versions, namely version 1.x and version 2.x. Magento uses both of these versions internally.
  • Apache or Nginx: Both Apache and Nginx are HTTP servers. Each has its distinct advantages and disadvantages. It would be unfair to say one is better than another, as their performance widely depends on the entire system's setup and usage. Magento works with Apache 2.2 and 2.4 and Nginx 1.7.
  • MySQL: MySQL is a mature and widely used relational database management system (RDBMS) that uses structured query language (SQL). There are both free community versions and commercial versions of MySQL. Magento requires at least the of MySQL Community Edition version 5.6.
  • MTF: Magento Testing Framework (MTF) delivers an automated testing suite. It covers various types of tests, such as performance, functional, and unit testing. The entire MTF is available on GitHub, which can be viewed by visiting https://github.com/magento/mtf as an isolated project.

Different pieces of technology can be glued into various architectures. There are different ways to look at the Magento architecture—from the perspective of a module developer, system integrator, or a merchant, or from some other angle.

The architectural layers

From top to bottom, Magento can be divided into four architectural layers, namely presentation, service, domain, and persistence.

The presentation layer is the one that we directly interact with through the browser. It contains layouts, blocks, templates, and even controllers, which process commands to and from the user interface. Client-side technologies such as jQuery, RequireJS, CSS, and LESS are also a part of this layer. Usually, three types of users interact with this layer, namely web users, system administrators, and those making the Web API calls. Since the Web API calls can be made via HTTP in a manner that is the same as how a user uses a browser, there's a thin line between the two. While web users and Web API calls consume the presentation layer as it is, the system administrators have the power to change it. This change manifests in the form of setting the active theme and changing the content of the CMS (short for content management system) pages, blocks, and the products themselves.

When the components of a presentation layer are being interacted with, they usually make calls to the underlying service layer.

The service layer is the bridge between the presentation and domain layer. It contains the service contracts, which define the implementation behavior. A service contract is basically a fancy name for a PHP interface. This layer is where we can find the REST/SOAP APIs. Most user interaction on the storefront is routed through the service layer. Similarly, the external applications that make the REST/SOAP API calls also interact with this layer.

When the components of a service layer are being interacted with, they usually make calls to the underlying domain layer.

The domain layer is really the business logic of Magento. This layer is all about generic data objects and models that compose the business logic. The domain layer models themselves do not contribute to data persistence, but they do contain a reference to a resource model that is used to retrieve and persist the data to a MySQL database. A domain layer code from one module can interact with a domain module code from another module via the use of event observers, plugins, and the di.xml definitions. Given the power of plugins and di.xml, its important to note that this interaction is best established using service contracts (the PHP interface).

When the components of the domain layer are being interacted with, they usually make calls to the underlying persistence layer.

The persistence layer is where the data gets persisted. This layer is in charge of all the CRUD (short for create, read, update, and delete) requests. Magento uses an active record pattern strategy for the persistence layer. The model object contains a resource model that maps an object to one or more database rows. Here, it is important to differentiate the cases of simple resource model and the Entity-Attribute-Value (EAV) resource models. A simple resource model maps to a single table, while the EAV resource models have their attributes spread out over a number of MySQL tables. As an example, the Customer and Catalog resource models use EAV resource models, while the newsletter's Subscriber resource model uses a simple resource model.

The top-level filesystem structure

The following list depicts the root Magento filesystem structure:

  • .htaccess
  • .htaccess.sample
  • .php_cs
  • .travis.yml
  • CHANGELOG.md
  • CONTRIBUTING.md
  • CONTRIBUTOR_LICENSE_AGREEMENT.html
  • COPYING.txt
  • Gruntfile.js
  • LICENSE.txt
  • LICENSE_AFL.txt
  • app
  • bin
    • composer.json
    • composer.lock
  • dev
    • index.php
  • lib
    • nginx.conf.sample
    • package.json
    • php.ini.sample
  • phpserver
  • pub
  • setup
  • update
  • var
  • vendor

The app/etc/di.xml file is one of the most important files that we might often look into during development. It contains various class mappings or preferences for individual interfaces.

The var/magento/language-* directories is where the registered languages reside. Though each module can declare its own translations under app/code/{VendorName}/{ModuleName}/i18n/, Magento will eventually fall back to its own individual module named i18n in case translations are not found in the custom module or within the theme directory.

The bin directory is where we can find the magento file. The magento file is a script that is intended to be run from a console. Once triggered via the php bin/magento command, it runs an instance of the Magento\Framework\Console\Cli application, presenting us with quite a number of console options. We can use the magento script to enable/disable cache, enable/disable modules, run an indexer, and do many other things.

The dev directory is where we can find the Magento test scripts. The lib directory comprises two major subdirectories, namely the server-side PHP library code and fonts found under lib/internal and the client-side JavaScript libraries found in lib/web.

The pub directory is where the publicly exposed files are located. This is the directory that we should set as root when setting up Apache or Nginx. The pub/index.php file is what gets triggered when the storefront is opened in a browser.

The var directory is where the dynamically generated group type of files such as cache, log, and a few others get created in. We should be able to delete the content of this folder at any time and have Magento automatically recreate it.

The vendor directory is where most of the code is located. This is where we can find various third-party vendor code, Magento modules, themes, and language packs. Looking further into the vendor directory, you will see the following structure:

  • .htaccess
  • autoload.php
  • bin
  • braintree
  • composer
  • doctrine
  • fabpot
  • justinrainbow
  • league
  • lusitanian
  • magento
  • monolog
  • oyejorge
  • pdepend
  • pelago
  • phpmd
  • phpseclib
  • phpunit
  • psr
  • sebastian
  • seld
  • sjparkinson
  • squizlabs
  • symfony
  • tedivm
  • tubalmartin
  • zendframework

Within the vendor directory, we can find code from various vendors, such as phpunit, phpseclib, monolog, symfony, and so on. Magento itself can be found here. The Magento code is located under vendor/magento directory, listed (partially) as follows:

  • composer
  • framework
  • language-en_us
  • magento-composer-installer
  • magento2-base
  • module-authorization
  • module-backend
  • module-catalog
  • module-customer
  • module-theme
  • module-translation
  • module-ui
  • module-url-rewrite
  • module-user
  • module-version
  • module-webapi
  • module-widget
  • theme-adminhtml-backend
  • theme-frontend-blank
  • theme-frontend-luma

You will see that the further structuring of directories follows a certain naming schema, whereas the theme-* directory stores themes, the module-* directory stores modules, and the language-* directory stores registered languages.

Summary

In this article we came across Magento and its platform architecture by having a high-level overview view of its technology stack, architectural layers, and top-level system.

Resources for Article:


Further resources on this subject:


You've been reading an excerpt of:

Magento 2 Developer's Guide

Explore Title