muhammad_97
@muhammad_97
PHP-разработчик

Модульность php-приложения (на примере интернет-магазина)?

К примеру есть движок для интернет-магазина (блога, форума, неважно). У него есть следующие модули:

Catalog - собственно, сам каталог товаров
Cart - корзина
Order - модуль заказа товара
Pages - информационные страницы
Payment - модуль для работы с API различных платежных систем
Search - поиск товаров
Users - регистрация/авторизация
Wishlist - список желаний пользователя

Цель:

Полный контроль над магазином. Захотелось сделать из магазина каталог товаров? Просто отключаем модуль регистрации и модуль заказа. Или, например, магазин "попроще": оставляем модуль каталога, корзины и заказа товара.

Возникают следующие проблемы:

1. Зависимость модулей друг от друга.

Простой пример:
Cart зависит от Order, Order в свою очередь зависит от Payment. В то же время ни Order, ни Payment не могут работать без Cart (если только не делать заказ товара в один клик). Как вариант, можно прописать в отдельном файле зависимости модуля (что-то вроде composer.json) и отключать/удалять зависимые модули при отключении/удалении модуля, от которого они зависят.

2. Проблемы с интерфейсом (верстка, темы оформления)

Основная проблема. Отключили регистрацию (корзину, поиск) - нужно удалить ссылки в шапке. Так и верстка можете полететь. Или же тема оформления не поддерживает нужный модуль.

Вопросы:

1. Возможно ли это? Если не полная, то хотя бы слабая зависимость модулей друг от друга?
2. Стоит ли оно того?
3. Какие есть пути уменьшения зависимости модулей друг от друга? Мне в голову приходит только модель ивентов.
  • Вопрос задан
  • 797 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
В то же время ни Order, ни Payment не могут работать без Cart

То есть у вас возникает циклическая зависимость Order и Cart? я так понимаю?

Вообще Order, Cart и Payment можно объеденить в один модуль, который задает базовые интерфейсы + тыща модулей с реализацией интерфейсов. Типа CardPayment и т.д. Словом нужно избавляться от циклических зависимостей и думать о кейсах когда с чем будет работать. Скажем Cart без Order не имеет смысла, а вот Order без Payment - имеет.

Или же тема оформления не поддерживает нужный модуль.

Хорошая идея - тема должна содержать метаданные о том какие модули оно поддерживает а какие нет. + идея с виджетами.

Возможно ли это? Если не полная, то хотя бы слабая зависимость модулей друг от друга?

Более чем, просто придется дробить систему не на такие вот модули а на отдельные компоненты, во всю использовать принципы единой ответственности, сегрегации интерфейсов и инверсии зависимостей.... короче убьете вы много времени но это возможно.

Стоит ли оно того?

Увы вы один не сможете написать и поддерживать такую систему. Многие пытались и даже есть парочка неплохих вариантов ( sylius.org например ), но в одиночку за приемлимое время - маловероятно.

Какие есть пути уменьшения зависимости модулей друг от друга?

Доменные события это к слову неплохой вариант уменьшения связанности, можно рассматривать как вариант. Но в целом должно хватать соблюдение принципов SOLID и более рациональное дробление функционала, поиск общих зависимостей и тд. Сегрегация интерфейсов + Инверсия зависимостей.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
2. Не стоит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы