Если вы никогда не работали в чужой среде, вы не будете знать, какие идеи вам подходят, а какие нет. Если вы когда-либо работали только с неорганизованным кодом спагетти, тогда у вас будет представление о том, что для вас имеет смысл. Если вы внесли существенную реорганизацию в неорганизованный код спагетти в более чем одном несвязанном проекте, у вас должно быть хорошее представление о том, как вы думаете при создании фреймворка. : -)
Если у вас нет четкого представления о том, как вы хотите написать фреймворк, но вы хотите написать его, я думаю, вам нужно начинать с нуля и строить его органично. Однако вы должны иметь некоторое представление о том, как вы хотите, чтобы он выглядел, даже если это что-то настолько глупое, как то, где вы хотите, чтобы включаемые файлы жили. Другими словами, все, что вам нужно, это отправная точка. Тогда это вопрос повторного учета уродства, когда вы сталкиваетесь с этим. Вскоре у вас будет обработчик базы данных, механизм диспетчеризации, возможно, уровень доступа к данным, просто, может быть, даже система шаблонов!
Отвечая на @MrFox, вы должны знать об опасных зависимостях. Очевидно, что уровень доступа к данным будет зависеть от обработчика базы данных; так что вы не хотите, чтобы ваш обработчик базы данных зависел от вашего уровня доступа к данным. На самом деле, вы не хотите, чтобы они тоже знали друг друга. Это должен быть разумный интерфейс «черного ящика».
Кроме того, ряд фреймворков пытаются построить «одну» иерархию объектов. Это означает, что они думают, что Действие - это Модель - это Обработчик базы данных. У меня лично есть проблемы с этой неправильно примененной абстракцией, так что это хедз-ап, чтобы не бояться отвергнуть эту идею, если она тоже не сработает для вас. Как сказал @Tyndall, нет ни одного, единственного «правильного» способа сделать это.