Разработка сайта на Magento / Adobe Commerce
Отметим: когда SaaS-платформы перестают справляться с нагрузкой, кастомизация упирается в ограничения API. В таких случаях пора смотреть в сторону Magento. Мы проектируем и запускаем enterprise-магазины на этой платформе. Решаем задачи высокой сложности: мультисайт с единой инсталляции, тысячи атрибутов и кастомные бизнес-процессы. За 7 лет мы реализовали 20+ проектов — от небольших магазинов до крупных маркетплейсов с миллионами товаров.
Magento 2 даёт полный контроль над кодом и архитектурой. Вы не ограничены шаблонами и плагинами сторонних разработчиков. Это особенно важно для проектов с уникальными бизнес-требованиями, например, сложная система скидок или интеграция с нестандартным API.
Magento Open Source vs Adobe Commerce
Выбор редакции зависит от масштаба, необходимых модулей и бюджета. Open Source не требует лицензионных отчислений, что даёт экономию до 70% по сравнению с Adobe Commerce. Обе платформы имеют сильные стороны, и мы поможем подобрать оптимальный вариант.
| Характеристика |
Magento Open Source |
Adobe Commerce |
| Лицензия |
MIT (бесплатная) |
Коммерческая |
| Хостинг |
Self-hosted |
Self-hosted или Cloud |
| B2B-модуль |
Нет |
Встроен |
| Page Builder |
Базовый |
Расширенный |
| Staged Content |
Нет |
Есть |
| Customer Segments |
Нет |
Есть |
| Live Search |
Нет |
Есть (SaaS) |
| Product Recommendations |
Нет |
Есть (AI-based) |
| Adobe Experience Cloud |
Нет |
Интеграция |
Для большинства проектов Open Source даёт всё необходимое. Adobe Commerce оправдан при B2B-сценариях с сложным ценообразованием, персонализацией или интеграцией с Adobe Analytics.
Почему стоит перейти на Magento 2?
Magento 1 перестал получать обновления несколько лет назад. Magento 2 полностью переписан: использует PHP 8, Dependency Injection, Plugin System, гибкий GraphQL API. Производительность выше благодаря Varnish, Redis, Elasticsearch — страницы с кешированием загружаются в 10 раз быстрее. Модульная архитектура позволяет добавлять любую функциональность без взлома ядра.
Рекомендованные версии компонентов
| Компонент |
Версия |
| PHP |
8.1–8.3 (оптимально 8.2) |
| MySQL/MariaDB |
8.0 / 10.6 |
| Elasticsearch/OpenSearch |
8.x / 2.x |
| Redis |
7.x |
| RabbitMQ |
3.11+ |
| Nginx/Apache |
1.24+ / 2.4 |
| Varnish |
7.x (опционально) |
| CPU (dev/prod) |
4 / 8 cores |
| RAM (dev/prod) |
8 / 16 GB |
Полный список системных требований
Magento 2 требует PHP 8.1–8.3, MySQL 8.0 или MariaDB 10.6, Elasticsearch/OpenSearch, Redis, RabbitMQ для очередей. Минимально 4 CPU и 8 GB RAM для разработки, для продакшена — 8 CPU и 16 GB RAM.
Техническая реализация
Архитектура модульной системы
Magento построен на модулях. Каждый модуль располагается в app/code/Vendor/Module/ и содержит:
-
Block/ — PHP классы для представления (устаревает)
-
Controller/ — обработчики HTTP-запросов
-
etc/ — конфиги: module.xml, di.xml, routes.xml, events.xml
-
Model/ — бизнес-логика
-
Plugin/ — interceptors (before/after/around)
-
Observer/ — подписка на события
-
Setup/ — установочные скрипты и data patches
-
view/frontend/ — layout XML и phtml-шаблоны
Dependency Injection и Plugin
Вместо new — инъекция через конструктор. В di.xml задаются предпочтения и плагины:
<preference for="Magento\Catalog\Model\Product"
type="MyCompany\Catalog\Model\Product"/>
<type name="Magento\Catalog\Model\ResourceModel\Product\Collection">
<plugin name="mycompany_catalog_collection_plugin"
type="MyCompany\Catalog\Plugin\ProductCollectionPlugin"
sortOrder="10"/>
</type>
Пример плагина с after-методом:
namespace MyCompany\Catalog\Plugin;
use Magento\Catalog\Model\ResourceModel\Product\Collection;
class ProductCollectionPlugin
{
public function afterLoad(Collection $subject, Collection $result): Collection
{
foreach ($result as $product) {
$margin = ($product->getPrice() - $product->getCost()) / $product->getPrice() * 100;
$product->setData('margin_percent', round($margin, 2));
}
return $result;
}
}
Кастомный атрибут продукта
Data patch добавляет атрибут "Срок доставки (дней)" без изменения ядра:
// Setup/Patch/Data/AddProductAttributes.php
namespace MyCompany\Catalog\Setup\Patch\Data;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Catalog\Setup\CategorySetupFactory;
class AddProductAttributes implements DataPatchInterface
{
public function __construct(
private readonly CategorySetupFactory $categorySetupFactory,
private readonly \Magento\Framework\Setup\ModuleDataSetupInterface $moduleDataSetup,
) {}
public function apply(): void
{
$setup = $this->categorySetupFactory->create(['setup' => $this->moduleDataSetup]);
$setup->addAttribute('catalog_product', 'delivery_days', [
'type' => 'int',
'label' => 'Срок доставки (дней)',
'input' => 'text',
'required' => false,
'visible' => true,
'user_defined' => true,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => true,
'used_in_product_listing' => true,
'unique' => false,
'apply_to' => '',
]);
$setup->addAttributeToSet('catalog_product', 'Default', 'General', 'delivery_days');
}
public static function getDependencies(): array { return []; }
public function getAliases(): array { return []; }
}
GraphQL API Magento
Для headless-фронта используем встроенный GraphQL:
query GetProduct($urlKey: String!) {
products(filter: { url_key: { eq: $urlKey } }) {
items {
id
sku
name
price_range {
minimum_price {
regular_price { value currency }
final_price { value currency }
discount { amount_off percent_off }
}
}
... on ConfigurableProduct {
configurable_options {
label
values { label uid }
}
variants {
attributes { label uid }
product {
sku
stock_status
price_range { minimum_price { final_price { value } } }
}
}
}
}
}
}
Типичный стек разработки
composer create-project --repository-url=https://repo.magento.com/ \
magento/project-community-edition=2.4.7 my-magento
bin/magento setup:install \
--db-host=localhost \
--db-name=magento \
--db-user=magento \
--db-password=secret \
--base-url=https://magento.local/ \
--admin-firstname=Admin \
--admin-lastname=User \
[email protected] \
--admin-user=admin \
--admin-password=Admin123! \
--language=ru_RU \
--currency=RUB \
--timezone=Europe/Moscow \
--use-rewrites=1 \
--search-engine=opensearch \
--opensearch-host=localhost \
--opensearch-port=9200
# После изменений
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy ru_RU en_US -f
bin/magento cache:flush
Пошаговая инструкция: создание кастомного модуля
- Создайте директорию
app/code/Vendor/Module/etc/ и файл module.xml.
- Объявите зависимости в
composer.json и registration.php.
- Определите маршруты в
routes.xml.
- Реализуйте
Controller, Model, Block по необходимости.
- Добавьте
di.xml для плагинов или предпочтений.
- Запустите
bin/magento setup:upgrade для установки.
Что входит в работу
При заказе разработки Magento-проекта под ключ мы предоставляем:
- Архитектурное проектирование: выбор модулей, настройка инфраструктуры, конфигурация Varnish/Redis/Elasticsearch
- Разработка кастомных модулей и расширений с полной документацией в формате README
- Интеграция с внешними системами: ERP, CRM, 1С, маркетплейсы
- Настройка мультисайта и store view
- Оптимизация производительности: кеширование, CDN, minification
- Деплой с CI/CD (GitLab/GitHub Actions)
- Техническая поддержка после запуска (с гарантийным периодом)
Сроки
Запуск магазина на Open Source с готовой темой и стандартным набором модулей — от 4 до 8 недель. Кастомная разработка с несколькими модулями и интеграцией с ERP — от 3 до 6 месяцев. Adobe Commerce с B2B-модулем, персонализацией и интеграциями — от полугода. Точные сроки оцениваем после аудита ваших требований.
Получите консультацию инженера по вашему проекту — мы оценим объём работ и предложим архитектурное решение. Наш опыт: более 7 лет разработки Magento, 20+ запущенных магазинов. Свяжитесь с нами для обсуждения ваших задач.
По данным Adobe, более 250 000 магазинов работают на Magento.
Разработка интернет-магазинов
Мы знаем: интернет-магазин — это не просто «сайт с корзиной». Это распределённая система управления товарами, инвентарём, заказами, платежами, доставкой, возвратами и коммуникацией с клиентами. Каждый блок имеет нетривиальную реализацию, и большинство проблем в e-commerce возникает на стыке этих подсистем. Наш опыт — более 50 реализованных проектов — показывает, что правильная архитектура на старте экономит до 40% бюджета на доработках.
Почему производительность каталога деградирует при росте SKU?
Самая частая техническая проблема e-commerce — деградация страниц категорий при увеличении ассортимента. Страница работает хорошо на 500 товарах и начинает тормозить на 10 000. Причины почти всегда одни и те же.
N+1 на атрибутах. Загружаете список товаров — 50 элементов. Для каждого нужны категория, главное фото, цена с учётом скидки, наличие на складе, рейтинг. Без правильного eager loading это 250+ запросов на страницу. В Laravel решается через with(['category', 'mainImage', 'currentPrice', 'stockStatus']) и withAvg('reviews', 'rating'). Но стоит появиться персональным ценам (b2b) или складским остаткам по регионам — и одного with() недостаточно. Нужны Query Object или выделенный ReadModel.
Фасетная фильтрация без индексов. Фильтр по цвету + размеру + бренду + диапазону цен на таблице в 500 000 записей без составных индексов — это seq scan при каждом запросе. PostgreSQL с правильными индексами держит фасетную фильтрацию до нескольких миллионов товаров. Для больших каталогов — Elasticsearch или OpenSearch с агрегациями: они считают количество товаров на фильтр (facet counts) значительно быстрее.
Пагинация через OFFSET. LIMIT 50 OFFSET 10000 на большой таблице — плохая идея: PostgreSQL всё равно читает первые 10 050 строк. Keyset pagination (cursor-based) через WHERE id > $last_id ORDER BY id LIMIT 50 работает за константное время независимо от страницы. Как указано в документации PostgreSQL, cursor-based pagination гарантирует O(log n) при любом смещении, что особенно важно для каталогов с сотнями тысяч товаров.
Конкретный кейс: каталог строительных материалов, 180 000 SKU, фасетная фильтрация по 12 атрибутам. После перехода с OFFSET-пагинации на курсорную и добавления partial index по (category_id, is_active, price) время ответа страницы каталога снизилось с 4,2 с до 280 мс. Экономия на серверных ресурсах составила около 30 000 ₽ в месяц. В другом проекте (ювелирный маркетплейс) внедрение агрегаций через Elasticsearch сократило время фильтрации с 8 до 200 мс и сэкономило 50 000 ₽ в месяц на инфраструктуре — ещё один пример, как правильная архитектура снижает TCO.
Что такое race condition в корзине и как его избежать?
Checkout — место, где деньги либо попадают на счёт, либо нет. Технические проблемы здесь стоят дорого.
Race condition при резервировании товара. Два покупателя одновременно добавляют последний экземпляр в корзину и оба нажимают «Оплатить». Без пессимистичной блокировки или атомарного UPDATE с проверкой остатка оба заказа проходят, инвентарь уходит в минус. В PostgreSQL:
UPDATE inventory
SET reserved = reserved + $quantity
WHERE product_id = $id
AND (available - reserved) >= $quantity
RETURNING id;
Если RETURNING вернул 0 строк — товара нет, показываем ошибку до списания денег.
Идемпотентность платёжных вебхуков. payment.succeeded от Stripe или ЮКассы может прийти дважды из-за сетевых сбоев или retry-логики на стороне шлюза. Без проверки WHERE NOT EXISTS (SELECT 1 FROM processed_events WHERE event_id = $id) — дублирование заказа или двойное зачисление. Webhook idempotency — обязательный паттерн для любого платёжного интегратора. Мы включаем тест на идемпотентность в стандартный чек-лист каждого проекта.
Checkout в несколько шагов. Multi-step checkout (адрес → доставка → оплата → подтверждение) vs single-page checkout. Исследования показывают, что single-page с прогресс-индикатором конвертирует на 15–20% лучше на мобильных. Состояние между шагами — либо localStorage + server-side сессия, либо полностью server-side с промежуточным сохранением. Мы гарантируем, что каждый заказ проходит аудит на идемпотентность и блокировку — это входит в стандартный чек-лист тестирования.
Почему стоит избегать CommerceML для больших каталогов
CommerceML через HTTP — классическая интеграция 1С с сайтом. 1С выгружает XML по расписанию, сайт импортирует. Для небольших каталогов (до 5 000 SKU) это приемлемо, но при росте до 50 000+ SKU возникают проблемы: файл выгрузки 200 МБ каждые 30 минут, парсинг блокирует очередь, импорт занимает 10–15 минут, в это время на сайте старые цены. Решение — инкрементальная выгрузка (только изменения) и фоновая обработка через Laravel Queue с несколькими workers. Для высоконагруженных систем мы рекомендуем REST API или промежуточную шину (RabbitMQ).
Интеграции: 1С, склад, доставка
1С — отдельная глава. Три распространённых способа интеграции:
-
CommerceML через HTTP — 1С выгружает XML по расписанию, сайт импортирует. Работает для небольших каталогов, есть задержка синхронизации.
-
REST API / OData от 1С — двусторонняя синхронизация в реальном времени. Требует настройки на стороне 1С, капризна к версиям конфигураций.
-
Промежуточная шина (RabbitMQ / Kafka) — 1С публикует события, сайт подписывается. Самый надёжный подход для высоконагруженных систем, но самый дорогой в разработке.
Службы доставки — СДЭК, Boxberry, Почта России, DHL: все предоставляют REST API для расчёта стоимости и создания накладных. Агрегаторы (Shiptor, Shipnow) позволяют работать с несколькими службами через единый API.
Платёжные шлюзы
| Шлюз |
Особенности интеграции |
| Stripe |
Webhook-based, отличная документация, Stripe Elements для PCI DSS |
| ЮКасса |
Популярен в РФ, поддержка ФЗ-54 (фискализация) |
| ЕРИП |
Белорусская система, SOAP API, специфическая документация |
| Tinkoff Acquiring |
REST API, 3D Secure 2.0, webhook-уведомления |
Для каждого шлюза обязательна проверка подписи вебхука — без этого любой может отправить фейковое payment.succeeded.
CMS vs собственная разработка
WooCommerce — оправдан для магазинов до ~5 000 SKU с типовой бизнес-логикой. Быстрый старт, огромная экосистема плагинов. Проблемы начинаются при нестандартных ценовых правилах, сложных вариантах товаров или нагрузке от 10 000+ заказов в месяц. Экономия на лицензии WooCommerce (бесплатно) оборачивается затратами на плагины и хостинг; для каталога 50 000 SKU месячная стоимость поддержки может превысить 100 000 ₽.
OpenCart, Prestashop — аналогичная история. Хороши для старта, ограничены при росте.
Собственная разработка на Laravel — для:
- Нестандартной бизнес-логики (подписки, аренда, b2b-прайсы, конфигуратор);
- Высоких требований к производительности;
- Сложных интеграций (несколько складов, ERP, маркетплейсы);
- Уникального UX checkout.
Как мы разрабатываем интернет-магазин: пошаговый процесс
-
Аналитика и проектирование. Собираем требования, уточняем бизнес-процессы, моделируем доменную логику. На выходе — техническое задание и архитектурная схема.
-
Backend и API. Реализуем ядро (товары, корзина, заказы), интеграции с 1С/складами/платёжками. Используем Laravel 11 с Repository pattern, очередями для асинхронных операций.
-
Frontend и checkout. Настраиваем React 18 / Next.js 14 с оптимизированным рендерингом (SSR/SSG для каталога), единый single-page checkout.
-
Тестирование. Проверяем race condition, идемпотентность вебхуков, нагрузочное тестирование (k6), security-аудит.
-
Деплой и мониторинг. Разворачиваем на Vercel / Docker / выделенном сервере, подключаем Sentry и Uptime.
SEO для e-commerce
Canonical и дублирование. Фасетная фильтрация генерирует тысячи URL (?color=red&size=M&sort=price). Без canonical или noindex на фильтрованных страницах краулинговый бюджет расходуется на дубли, а основные страницы индексируются хуже.
Structured data. Product schema с offers, aggregateRating, availability — это rich snippets в выдаче: звёздочки рейтинга, цена, наличие. Влияет на CTR.
Core Web Vitals на страницах товаров. Hero image товара — это LCP element. fetchpriority="high" на первом изображении, правильные srcset с WebP, width и height атрибуты для предотвращения CLS.
Что входит в результат работы
После завершения проекта вы получаете:
- Исходный код и полную документацию (API, архитектура, инфраструктура);
- Доступы к репозиторию, хостингу, мониторингу (Sentry, Uptime);
- Обучение команды работе с админ-панелью и кастомизациями;
- Гарантийную поддержку 3 месяца (исправление ошибок, консультации);
- Подробный отчёт по нагрузочному тестированию и оптимизации.
Ориентиры по срокам
| Тип магазина |
Срок |
| Малый (до 1 000 SKU, типовая логика) |
8–12 недель |
| Средний (до 50 000 SKU, интеграция 1С) |
14–20 недель |
| Крупный (100 000+ SKU, ERP, маркетплейсы) |
24–40 недель |
Стоимость рассчитывается после анализа требований: количество интеграций, сложность ценообразования, объём каталога и уникальность UX — основные факторы. Оценим ваш проект бесплатно — закажите консультацию.
Чек-лист перед запуском
- Race condition при оплате последнего товара — покрыт тестом
- Идемпотентность вебхуков платёжного шлюза
- Rate limiting на эндпоинтах корзины и checkout
- Canonical на фильтрованных страницах каталога
- Фискализация чеков (ФЗ-54 для РФ или аналог)
- Стресс-тест checkout под нагрузкой (k6 или Locust)
- Мониторинг ошибок (Sentry) и алерты на payment errors
- Backup базы данных с проверенным restore-процессом
Гарантируем — каждый проект проходит этот чек-лист перед релизом. Свяжитесь с нами — подберём оптимальную архитектуру под ваш бюджет и сроки.