Мульти-клиентское приложение на PHP

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
LinGG
Сообщения: 4
Зарегистрирован: 2011.09.13, 07:32

Мульти-клиентское приложение на PHP

Сообщение LinGG » 2017.11.20, 17:01

Всем привет, у меня стоит достаточно интересная задача - сделать рефактор текущего приложения на Yii1 так, чтобы отдельные клиенты могли получать отельные фичи в виде плагинов. На данном этапе все выглядит так - копия одного приложения склонирована в разные репозитории - каждый под отдельного клиента. Примерно 80 процентов кода используется в каждом клиенте и 20 - специфика. Если нужна отдельная фича для клиента - фича добавляется только в репо этой копии приожения для клиента. Пробемы наступают, когда нужно добавить общую фичу во все репозитории: так как код в клиентских репо уже мог "убежать вперед", то средствами гита сделать черри пик становится проблематично ввиду разности кода. И тут начинается самый ад, общие фичи переносятся руками в каждый репо - это порождает хаос и прочие проблемы... Подскажите может у вас есть мысли как организовать этот код? Что пришло мне:

1) контроллеры. в конфиг выносится кастомное поле типа "префикс клиента" и если оно есть все роуты переадресовываются на кастомный контроллер, который был унаслоедован от базы. Например имеем - UserController.php, добавляем папку client1 в папку controllers, добавляем client1 в конфиг и сздаем новый контроллер Client1UserController.php extends UserController. Это уже протестировал - вроде работает неплохо. Едиснтвенное смущение - человек незнакомый с ситуаций не поймет почему user\index срабатывает в Client1UserController::index()
p.s. я знаю что можно внутренними средствами Yii решить через неймспейсы, но мне это решение не очень понравилось. И в принципе этот момент решен, не вижу пока проблем которые могли бы вылезти с контроллерами.

2) модели как я не старался, ничего не пришло в голову со спуфингом имен моделей. В идеале было бы конечно унаследоваться от текущих моделей с таким же имененем, чтобы по всему приложению не рефакторить имена моделей. Что сделано: текущие модели придется переименовывать и добавлять префикс Base и положить в models\base например. В папке models создать пустышки с прежними именами унаследованные от только что переименованных базовых. В папке models создана папка с префиксом как и в контроллерах напр. models\client1 и туда кладутся модели также унаследованные от Base моделей только уже с кастомным кодом для клиентов.
тут меня очень смущает что придется все переименовывать и переопределять пустышки с прежними именами. Тоже самое придется делать с папкой components. Лучшего решения не нашел.

2) представления пока ничего не решал, но думаю сделать функцию которая будет сравнивать текущую папку с темой и если в определенной папке для клиента есть файл повторяющий путь - он имеет приоритет и загружается он. Либо тупо иметь отдельную тему для каждого клиента и руками ее "вести".

может кто сталкивался с похожими задачами (не обязательно на Yii), буду очень рад если поделитесь мыслями.

Ответить