Проблема:
У нас есть веб-приложение (в Symfony 2.8) с + - 125 таблицами, заполненными данными. Теперь наш клиент просит добавить дополнительный верхний уровень под названием «Подразделение». И когда они создают новое подразделение, они получают чистую копию приложения, чтобы начать работу. Это почти как новый чистый лист.
Пользователи останутся прежними, некоторые получат доступ к 1 дивизиону, некоторые - к нескольким.
Важно: В будущем появится больше подразделений, администраторы клиента могут просто нажать «новое подразделение»..
Теперь мы просматриваем все приложение:
Сущности высший уровень получают дополнительное свойство Division (через DivisionTrait), добавленное к ним ...
изменяя каждый запрос, добавляя что-то вроде AND division.id = $session->get('current_division') во все контроллеры.
Внедрение этого идентификатора подразделения во все типы форм, а также расширение каждого запроса.
И конечно много тестирования и отладки
Но это много работы.
Вопрос:
Какие есть варианты или шаблоны проектирования, чтобы мы могли добиться этого более простым способом? Я уверен, что мы не первые, кто столкнулся с этой проблемой. ;)
Хорошо, вы правы, мы должны вывести запросы из контроллеров, но это не мой вопрос;)
Вы не собираетесь иметь отдельную базу данных для каждого подразделения?
Действительно, мы хотим хранить все в одной базе данных. Более того, я полагаю, что в будущем некоторые данные будут доступны по нескольким подразделениям. Клиент часто меняет свое мнение, но не волнуйтесь. Клиент хороший, они всегда платят за дополнительные часы;)






Похоже, вы ошибаетесь ... или ваше описание проблемы вводит в заблуждение.
На мой взгляд, у каждого отдела есть свое приложение (со своим доменом). С собственной независимой базой данных. То, что является общим, - это учетные записи пользователей, что означает, что вам необходимо создать третье приложение: систему аутентификации, которая может идентифицировать ваших пользователей и проверять их авторизацию для доступа к одному из подразделений.
Итак, сделайте систему аутентификации.
Свяжите общий идентификатор с внутренней таблицей «пользователей», которую вы будете использовать для ACL / RBAC, но оставьте логин для обработки внешнего приложения.
Таким образом, вам не придется вручную редактировать весь код и пытаться втиснуть квадратный стержень в круглое отверстие.
Пользователь-администратор клиента должен иметь возможность просто нажать «новое подразделение» и начать работу без нашего вмешательства.
Затем, надеюсь, вы сказали клиенту, что это займет не меньше месяца, так как вам нужно полностью переделать все это. Вам необходимо изменить не только систему аутентификации, но и авторизацию. И для нескольких таблиц потребуется добавление внешнего столбца division_id. Тут бардак и хороших вариантов нет - просто много ручного труда, чтобы все переписать :(
Почему у вас в контроллерах есть SQL-запросы? Похоже, в этой кодовой базе может быть много более глубоких проблем =)