У нас есть довольно большое веб-приложение Symfony 2, которое имеет множество различных конечных точек и функций:
Уровень базы данных (в Doctrine) тесно связан. Транзакции из POS и нашего унаследованного продукта используются на порталах лояльности конечных пользователей, а счета-фактуры основаны на одних и тех же транзакциях. Очевидно, что есть также много сущностей, которые предназначены исключительно для определенных частей приложения.
Изначально мы выбрали единый подход «приложение + пакет» для простоты программирования, который хорошо послужил нам при разработке всей платформы. К сожалению, основными недостатками являются:
Я провел некоторое исследование, чтобы разделить проект Symfony на несколько проектов (каждый со своим GitHub) и использовать SOA для их соединения. Мой личный опыт, связанный с SOA, заключается в том, что это затрудняет полное тестирование и добавляет много накладных расходов при переходе со стандартных форм Symfony 2 (что мне очень нравится).
Я также думал о другом решении, создавая общий пакет с общими сущностями и репозиториями. Это значительно упростило бы тестирование кода и совместное использование общих служб (менеджеров), хотя я также слышал аргументацию против крупных менеджеров. Большим недостатком этого является то, что мы не можем просто использовать doctrine: schema: update затем, потому что совместное использование базы данных и обновление базы данных в проекте с более низкой версией общего пакета удалит поля .. что приведет к потере данных. Также при таком подходе я не смог найти никаких примеров или вариантов использования … что заставляет меня задуматься, не будет ли у него еще много минусов.
Итак, мой вопрос: каковы общие подходы и решения для разделения такого большого проекта? И еще: есть ли причины, по которым, возможно, его вообще не следует разделять?
Хотя я отвечаю на ваш вопрос, довольно сложно найти волшебное решение для ваших проблем. Это не попытка решить все ваши проблемы и не навязать вам их следование. Это не единственно возможное решение, на самом деле это может даже не решить ваши проблемы. Тем не менее, давайте начнем.
Я бы разделил проект на 4 слоя:
Ваш веб-интерфейс будет находиться в презентации. Если среда, которую вы используете в своей сети, должна использовать MVC и, следовательно, иметь контроллеры, эти контроллеры должны отправляться на уровень приложений (я знаю, это звучит избыточно). Ваши API будут находиться на уровне приложений.
Это очень разделено: если вам нужно перейти с Doctrine на Laravel, вам не нужно менять ни домен, ни приложения. Если вам нужно перейти с Symphony на что-либо другое или даже изменить свой веб-сайт с PHP на ASP или Java, ваш домен не нужно менять.
Добавление большего количества слоев, сопоставление объектов, использование DI не должно замедлять запросы, учитывая цену и емкость оборудования в настоящее время, разница во времени практически незаметна. Вы должны приложить усилия, пытаясь улучшить свой домен, который приносит ценность для бизнеса. Разделение слоев улучшает разделение, повышает вероятность того, что часть приложения будет изменена, а другие части — гибче, повысит гибкость масштабирования приложения и упростит тестирование.
Рейн, каково было решение, которое ты наконец-то нашел? Вы на самом деле разделили свой проект?
В этой области действительно не хватает информации, я только что нашел одну разумную статью https://ig.nore.me/presentations/2015/04/splitting-a-symfony-project-into-separate-tiers/