Architektura Magento – jak działa od strony technicznej

magento

Magento uchodzi za jedną z najbardziej elastycznych i rozbudowanych platform e‑commerce typu open source. Za tą elastycznością stoi przemyślana, warstwowa architektura, która pozwala skalować sklepy od kilku produktów po rozbudowane marketplace’y działające w wielu krajach. Zrozumienie, jak Magento funkcjonuje od strony technicznej, pomaga lepiej planować rozwój sklepu, optymalizować wydajność i unikać kosztownych błędów przy wdrażaniu nowych funkcji.

Fundamenty architektury Magento

Warstwowa budowa i podejście modułowe

Magento jest zbudowane w oparciu o warstwową architekturę, w której każda warstwa ma jasno określoną odpowiedzialność. Na najniższym poziomie znajduje się warstwa dostępu do danych, nad nią logika biznesowa, następnie warstwa prezentacji odpowiadająca za generowanie widoków. Taka separacja pozwala na niezależne rozwijanie i testowanie poszczególnych części systemu.

Kluczową rolę odgrywa tu podejście modułowe. Każda większa funkcjonalność – katalog produktów, koszyk, zamówienia, płatności – jest osobnym modułem. Moduły mogą być włączane, wyłączane, rozszerzane lub nadpisywane bez ingerencji w rdzeń systemu. Dzięki temu projektanci i programiści mogą skupić się na logice biznesowej i integracjach specyficznych dla danego sklepu, zamiast modyfikować kod bazowy platformy.

Struktura modułów jest ściśle określona: każdy moduł ma własny plik konfiguracyjny, katalogi na kontrolery, modele, widoki, zasoby statyczne oraz pliki konfiguracyjne XML. Zależności pomiędzy modułami są deklarowane w konfiguracji, co ułatwia zarządzanie kolejnością ładowania i unikanie konfliktów.

Wzorzec MVC i jego specyfika w Magento

Magento implementuje własną odmianę wzorca MVC (Model–View–Controller). Modele odpowiadają za logikę biznesową i dostęp do danych; kontrolery przyjmują żądania HTTP, uruchamiają odpowiednie akcje i przekazują dane do widoków; widoki generują HTML prezentowany użytkownikowi.

W praktyce Magento rozszerza klasyczny MVC o dodatkowe mechanizmy, takie jak layouty XML, bloki i szablony. Kontroler uruchamia akcję, która inicjuje layout, layout tworzy strukturę bloków, a każdy blok jest połączony z określonym szablonem phtml. Dopiero kombinacja bloków i szablonów daje finalny kod HTML. Ta wielostopniowa ścieżka sprawia, że architektura prezentacji jest bardziej elastyczna, choć na początku może wydawać się złożona.

Rozdzielenie bloków i szablonów umożliwia ponowne wykorzystanie komponentów wizualnych w różnych częściach sklepu oraz łatwe modyfikowanie elementów interfejsu bez zmiany logiki kontrolerów. To rozwiązanie dobrze wpisuje się w złożone scenariusze e‑commerce, w których te same dane muszą być prezentowane na wiele różnych sposobów.

Wykorzystanie PHP i frameworka Zend / Laminas

Magento jest napisane w języku PHP, co ułatwia znalezienie programistów zdolnych do pracy z tą platformą. W wersji Magento 2 szkielet aplikacji opiera się w dużej mierze na komponentach wywodzących się z frameworka Zend (obecnie Laminas). Dotyczy to m.in. obsługi żądań HTTP, routingu, filtrów, walidacji oraz części mechanizmów bezpieczeństwa.

Wykorzystanie sprawdzonych komponentów frameworkowych zmniejsza liczbę błędów i zagrożeń bezpieczeństwa, a także umożliwia pisanie rozszerzeń w sposób zgodny z najlepszymi praktykami programistycznymi. Programista znający nowoczesne frameworki PHP dużo szybciej odnajdzie się w strukturze i stylu kodu Magento niż w autorskich, zamkniętych rozwiązaniach.

Dependency Injection i konfiguracja w XML

Magento 2 wprowadziło szerokie użycie wzorca Dependency Injection (DI), co oznacza, że zależności pomiędzy klasami są wstrzykiwane, a nie tworzone ręcznie wewnątrz obiektów. Pozwala to na łatwiejsze testowanie jednostkowe, wymianę implementacji oraz lepszą kontrolę nad cyklem życia obiektów.

Konfiguracja DI jest oparta na plikach XML (di.xml), w których definiuje się m.in. powiązania interfejsów z konkretnymi implementacjami, preferencje klas, obserwatorów zdarzeń i pluginy. XML jest również używany do definiowania tras, menu w panelu administracyjnym, struktur modułów oraz layoutów. Choć może to wydawać się rozbudowane, ta warstwa konfiguracyjna zapewnia dużą kontrolę nad zachowaniem systemu bez konieczności zmiany kodu źródłowego.

Dzięki DI Magento może dynamicznie podmieniać klasy i rozszerzać istniejącą funkcjonalność, zachowując przy tym spójność architektury i czytelność powiązań pomiędzy komponentami.

Mechanizm modułów i rozszerzeń

Struktura modułu i jego cykl życia

Każdy moduł Magento ma swój katalog z unikalną przestrzenią nazw, plikiem registration.php, deklaracją w module.xml oraz zestawem podkatalogów na kontrolery, modele, widoki, konfigurację i dane instalacyjne. Taka struktura sprawia, że moduły są w dużym stopniu samowystarczalne i mogą być przenoszone pomiędzy instalacjami.

Cykl życia modułu obejmuje instalację, aktualizacje oraz ewentualne odinstalowanie. Magento przechowuje informację o wersjach modułów w bazie danych, a pliki setup (w starszych wydaniach) lub data/ schema patches (w nowszych) odpowiadają za tworzenie i modyfikację schematu bazy danych oraz inicjalnych danych. Podczas wdrażania nowej wersji sklepu Magento automatycznie uruchamia odpowiednie skrypty aktualizacyjne na podstawie zmian w wersjach modułów.

Takie podejście pozwala synchronizować kod źródłowy z strukturą bazy danych bez ręcznego uruchamiania migracji SQL. Jednocześnie wymaga starannego planowania zmian w modułach, aby uniknąć konfliktów pomiędzy rozszerzeniami tworzonymi przez różnych dostawców.

Rozszerzanie funkcjonalności: events, observers i pluginy

Jednym z filarów elastyczności Magento jest system zdarzeń i obserwatorów. W krytycznych miejscach logiki – takich jak dodanie produktu do koszyka, złożenie zamówienia czy zmiana statusu płatności – platforma wywołuje zdarzenia. Moduły mogą do tych zdarzeń przypinać obserwatorów, którzy wykonują dodatkowe akcje, np. synchronizację z ERP, zapis do systemu CRM albo wysyłkę powiadomień.

Oprócz zdarzeń Magento oferuje pluginy (interceptory), które pozwalają wstrzykiwać się przed, po lub wokół wykonania wybranych metod klas. Umożliwia to modyfikowanie zachowania systemu bez nadpisywania całych klas lub metod. To ważne z punktu widzenia aktualizacji – poprawnie zaimplementowany plugin jest mniej podatny na kolizje z nowymi wersjami rdzenia niż klasyczna metoda override.

Obsługa zdarzeń i pluginów jest konfigurowana w plikach XML modułów. Programista może precyzyjnie określić, w jakim obszarze aplikacji działa dany obserwator lub plugin (frontend, adminhtml, global), co ma znaczenie dla wydajności i bezpieczeństwa.

Tema­ty i dziedziczenie wyglądu sklepu

Warstwa prezentacji w Magento jest zorganizowana w postaci motywów (themes). Motyw definiuje szablony phtml, pliki layoutu, grafiki i style CSS/LESS. Podstawowym motywem jest domyślny theme Magento, który może być dziedziczony przez kolejne motywy, dostosowane do potrzeb danego sklepu lub marki.

Dziedziczenie motywów umożliwia rozbudowę i modyfikację wyglądu bez kopiowania całej struktury plików. Wystarczy nadpisać wybrane szablony lub layouty, aby zmienić układ strony produktowej, koszyka czy checkoutu. System fallbacku plików powoduje, że Magento szuka szablonu najpierw w aktywnym motywie potomnym, następnie w jego rodzicu, a na końcu w motywie bazowym.

W praktyce oznacza to, że jedna instalacja Magento może obsługiwać wiele motywów jednocześnie – np. dla różnych wersji językowych lub marek – przy zachowaniu wspólnej logiki biznesowej i konfiguracji produktów. To rozwiązanie jest szczególnie cenne dla dużych organizacji zarządzających wieloma sklepami w jednym środowisku.

Marketplace i moduły zewnętrzne

Magento posiada rozbudowany ekosystem rozszerzeń dostępnych w oficjalnym marketplace oraz w repozytoriach zewnętrznych. Moduły te dodają m.in. integracje z bramkami płatniczymi, systemami kurierskimi, platformami marketing automation, narzędziami analitycznymi czy programami lojalnościowymi.

Od strony technicznej zewnętrzny moduł nie różni się zasadniczo od modułów rdzenia – korzysta z tych samych interfejsów, wzorców i konfiguracji. Ważne jest jednak, aby moduły były zgodne z wytycznymi jakościowymi i nie ingerowały bezpośrednio w kod bazowy. Dobrze zaprojektowany moduł powinien używać eventów, pluginów i DI zamiast modyfikacji plików core.

Wdrażając sklep na Magento, warto przyjąć strategię ograniczania liczby modułów zewnętrznych do tych naprawdę potrzebnych oraz weryfikować jakość ich wykonania. Nadmierna liczba rozszerzeń lub źle napisane moduły mogą prowadzić do spadku wydajności, konfliktów w konfiguracji i problemów z aktualizacjami.

Przetwarzanie danych i wydajność

Model danych: EAV i tabele płaskie

Magento wykorzystuje specyficzny model danych dla produktów i części encji, zwany EAV (Entity–Attribute–Value). Dane są rozbite na entity (np. produkt), atrybuty (np. kolor, waga) oraz ich wartości w dedykowanych tabelach. Takie podejście daje ogromną elastyczność w definiowaniu nowych pól bez konieczności modyfikacji struktury bazy danych.

Model EAV ma jednak swoją cenę: zapytania do bazy są bardziej złożone, co może wpływać na czas odpowiedzi przy dużej liczbie produktów. Aby temu przeciwdziałać, Magento stosuje tabele płaskie (flat), w których często używane dane są skompilowane do uproszczonej struktury. Indeksy aktualizują te tabele na podstawie zmian w EAV, zapewniając lepszą wydajność zapytań odczytu.

W praktyce zarządzanie EAV wymaga świadomej konfiguracji atrybutów oraz indeksów. Należy unikać nadmiernej liczby atrybutów globalnych i dbać o prawidłowe ustawienia zakresu (store view, website, global), aby niepotrzebnie nie komplikować zapytań i logiki przetwarzania.

Indeksy, cache i mechanizmy przyspieszania

Duże sklepy na Magento nie mogłyby działać sprawnie bez rozbudowanego systemu indeksów i pamięci podręcznej. Indeksy odpowiadają za przeliczenie danych tak, aby zapytania w trakcie przeglądania sklepu były jak najprostsze. Dotyczy to m.in. katalogu produktów, cen, uprawnień klientów oraz struktur kategorii.

Magento wykorzystuje kilka warstw cache: wewnętrzny cache konfiguracji, cache wyników renderowania bloków, cache typu full page, a także zewnętrzne magazyny pamięci, takie jak Redis czy Varnish. Full Page Cache przechowuje gotowe wersje stron dla niezalogowanych użytkowników, skracając czas generowania odpowiedzi do ułamka sekundy.

W dobrze skonfigurowanym środowisku większość żądań trafia do cache, a silnik PHP i baza danych są angażowane głównie przy działaniach dynamicznych, takich jak logowanie, koszyk czy checkout. Optymalizacja konfiguracji cache i indeksów jest kluczowa przy skalowaniu sklepu do dużego ruchu.

Asynchroniczność, kolejki i zadania w tle

Wraz ze wzrostem liczby zamówień i integracji z zewnętrznymi systemami rośnie potrzeba przenoszenia części operacji do przetwarzania asynchronicznego. Magento udostępnia mechanizmy kolejek, cronów oraz API asynchronicznego, które pozwalają odciążyć obsługę żądań HTTP.

Zadania takie jak wysyłka e‑maili, eksport danych do ERP, generowanie feedów produktowych czy aktualizacja raportów sprzedaży mogą być wykonywane w tle. Dzięki temu użytkownik końcowy otrzymuje odpowiedź szybciej, a najbardziej kosztowne obliczeniowo operacje są rozkładane w czasie.

Konfiguracja cronów i kolejek wymaga współpracy z infrastrukturą serwerową, ale stanowi fundament stabilności przy większej skali biznesu. Poprawnie zaprojektowane procesy asynchroniczne redukują ryzyko przeciążeń podczas kampanii promocyjnych czy wyprzedaży.

Skalowanie horyzontalne i pionowe

Architektura Magento pozwala na skalowanie zarówno pionowe (mocniejszy serwer), jak i horyzontalne (wiele serwerów). W praktyce duże sklepy stosują najczęściej architekturę wielowarstwową: osobne serwery dla bazy danych, cache, wyszukiwarki (np. Elasticsearch), plików statycznych oraz aplikacji PHP.

Skalowanie horyzontalne aplikacji jest możliwe dzięki temu, że stan użytkownika (sesja) może być przechowywany w zewnętrznym magazynie, np. Redisie, a pliki statyczne i multimedia mogą być serwowane z CDN. Węzły aplikacyjne są wtedy w dużym stopniu bezstanowe, co ułatwia ich powielanie i równoważenie obciążenia.

Świadome zaprojektowanie topologii infrastruktury ma kluczowe znaczenie dla sklepów działających na wielu rynkach, w wielu strefach czasowych, z ruchem liczonym w tysiącach użytkowników równocześnie. Magento, przy odpowiedniej konfiguracji, potrafi obsłużyć takie scenariusze bez fundamentalnych zmian w kodzie.

Proces obsługi żądania od URL do odpowiedzi

Routing i front controllery

Podstawą przetwarzania żądań w Magento jest mechanizm routingu. Cały ruch HTTP trafia do centralnego front controllera index.php, który inicjuje środowisko aplikacji i przekazuje żądanie do komponentu odpowiedzialnego za analizę ścieżki URL.

Routing opiera się na trzech głównych elementach: area (frontend, adminhtml, crontab i inne), nazwie modułu oraz nazwie kontrolera i akcji. Konfiguracja tras znajduje się w plikach XML modułów. Na tej podstawie system ustala, który kontroler powinien obsłużyć dane żądanie. Pozwala to dodawać nowe strony, API lub panele administracyjne wyłącznie poprzez konfigurację i kod modułu.

Taki mechanizm zapewnia dużą elastyczność przy budowie własnych funkcjonalności – np. dedykowanych formularzy, paneli partnerów czy niestandardowych końcówek API. Jednocześnie zachowana jest spójność logiki routingu w całej aplikacji.

Layouty, bloki i szablony

Po wybraniu odpowiedniego kontrolera i akcji Magento uruchamia mechanizm layoutu. Layout jest definiowany w XML i opisuje, jakie bloki mają zostać wyświetlone na stronie, w jakiej kolejności oraz jakie szablony mają być do nich przypisane. Każdy blok jest obiektem PHP, który przygotowuje dane do renderowania, a szablon phtml odpowiada za ich prezentację.

Strony sklepu – od listy produktów po checkout – są kompozycją wielu bloków. Przykładowo, strona produktowa zawiera blok główny produktu, galerię zdjęć, opis, recenzje, produkty powiązane, rekomendacje, przyciski dodania do koszyka, itd. Układ tych elementów można modyfikować poprzez layouty, bez ingerencji w logikę biznesową.

Mechanizm bloków i layoutów czyni warstwę prezentacji bardzo granularną i możliwą do ponownego wykorzystania. Jednocześnie programista musi dbać o optymalizację liczby bloków i zapytań wykonywanych z ich poziomu, aby nie przeciążyć procesu renderowania strony.

Obsługa sesji, koszyka i checkoutu

Magento wykorzystuje sesje do przechowywania informacji o użytkowniku, takich jak zawartość koszyka, dane logowania czy ustawienia waluty i języka. Sesje mogą być przechowywane w plikach, bazie danych lub zewnętrznych systemach typu Redis, co jest szczególnie ważne przy skalowaniu horyzontalnym.

Logika koszyka (quote) i zamówienia (order) jest precyzyjnie oddzielona. Koszyk przechowuje dane tymczasowe – produkty, rabaty, metody dostawy i płatności – dopóki klient nie sfinalizuje transakcji. Dopiero podczas checkoutu dane z koszyka są przekształcane w pełnoprawne zamówienie zapisane w bazie danych. Pozwala to na skomplikowane scenariusze rabatowe i kalkulacje cen bez wpływu na historię zamówień.

Proces checkoutu jest zbudowany modułowo, co pozwala modyfikować kolejne kroki, dodawać dodatkowe pola, integrować płatności oraz zewnętrzne systemy walidacji. W przypadku Magento 2 checkout wykorzystuje intensywnie JavaScript (Knockout, UI Components), ale rdzeń logiki biznesowej pozostaje po stronie PHP, w warstwie serwerowej.

Logika biznesowa a interfejs administracyjny

To, co dzieje się w frontendzie sklepu, jest ściśle powiązane z konfiguracją w panelu administracyjnym. Adminhtml jest osobnym area aplikacji z własnymi kontrolerami, layoutami i motywem. Logika zarządzania produktami, zamówieniami, klientami czy konfiguracją sklepu jest jednak wspólna i osadzona w tych samych modelach i serwisach.

Dzięki temu zmiana ustawień w panelu – np. stawek podatku, reguł promocji czy parametrów wysyłki – automatycznie wpływa na logikę działania całego sklepu, bez konieczności modyfikowania kodu. Panel administracyjny jest więc rozbudowanym interfejsem do zarządzania logiką biznesową zakodowaną w modułach.

Takie podejście sprawia, że Magento jest narzędziem przyjaznym dla biznesu: wiele zmian, które w innych systemach wymagałyby ingerencji programisty, można wprowadzić poprzez konfigurację. Jednocześnie programiści mają pełną kontrolę nad tym, jakie opcje konfiguracyjne udostępnić użytkownikom panelu, co zwiększa bezpieczeństwo i spójność projektu.

< Powrót

Zapisz się do newslettera


Zadzwoń Napisz