Я обещал следующей статьей начать цикл посвященный классам ядра системы. Цикл статей будет, и начнется со следующей статьи о хранении параметров системы. Но уже в середине процесса написания новой статьи, я вспомнил, что я не слова не сказал о структуре папок системы.
Основываясь на требования, выдвинутые в прошлой статье, можно сформулировать основные моменты по структуре каталогов.
- Ядро системы вместе с файлами фреймверка храниться отдельно от сайта. То что это может быть специальное место на сервере и все сайты могут иметь у себя лишь символическую ссылку (с случае *nix систем) — это дело Ваше, тут решать Вам, но для строгой структурности системы, ядро лучше располагать отдельно от остальной части системы. Права на запись в эту папку могут быть только у владельца всего этого добра. Сюда сайт писать ничего не должен, а значит лучше запретить.
- Модули лежат в одном каталоге (каждый модуль может быть так же символической ссылкой). Права на запись такие же как и для ядра. Шаблоны админки каждого модуля хранятся здесь же.
- Хранение переменных окружения системы в целом. Т.е. здесь будут основные файлы конфигурации ядра — например, доступ к БД, тема оформления всего сайта. Здесь же должны располагаться плагины и помощники расширяющие систему конкретно для этого сайта. Сюда сайт должен логировать ошибки своей работы. Права доступа более сложные — как минимум — возможность записи логов, на этапе разработки сайта — запись конфигурации, редактирование темы оформления.
- Хранение переменных окружения модулей. В этой папке должен быть набор папок повторяющих набор модулей доступных для сайта. Здесь будут храниться настройки каждого конкретного модуля, его шаблоны, собственные плагины и помощники переопределяющие стандартные для модуля (если требуется специфический функционал модуля для конкретного сайта).
- Папка для хранения кеша.
- И, наконец, папка смотрящая «в мир». Т.е. папка доступная извне.
Да, это накладывает некоторые строгие требования на стиль программирования, но программирование штука, сама по себе, строгая и требует ответственности.
Итак вот что у меня получилось в результате:
|-- CORE -- главный каталог системы, на него даются символическая ссылки в каждом сайте | |-- engine -- папка приложения ядра | | |-- config -- конфиги системы (почти не используются, т.к. все важно вынесено в конфиги конкретного сайта) | | |-- controllers -- контроллеры ядра, все вызовы проходят через них. | | |-- helpers -- файлы с функциями-помощниками | | |-- language -- языковые пакеты системы -- только базовые объявления характерные для фреймверка или ядра | | | |-- english | | | |-- russian | | | `-- ukrainian | | |-- libraries -- фактическое ядро. Набор библиотек реализующих API ядра для работы всей системы. | | |-- models -- модель данных ядра. | | `-- plugins -- плагины системы. Фактически то же что и helpers, но несут другую смысловую нагрузку ` `-- system -- Фреймверк CodeIgniter |-- modules -- модули системы. Здесь лежат ВСЕ доступные модули. Фактически отдельные приложения. Каждый модуль -- симлинк на основной репозитарий. | |-- admin -- -- модуль админ-панели | |-- categorys -- -- категории | |...... | `-- user -- -- пользовательская авторизация | |-- config ----- Далее представлена структура папок модуля, повторяющая стандартное приложение на базе CI | |-- controllers | |-- libraries | |-- models | `-- views ` `-- adm -- ВАЖНО! Шаблоны Админ части модулей находятся именно среди общего репозитария. Т.е. едины для всех сайтов Далее, набор папок относящихся к конкретному сайту |-- cache -- 755 (www-data) Кеш системы. Кеш для данных | `-- full_pages -- 755 (www-data) Постраничный кеш. |-- main_vars -- Переменные окружения ядра | |-- config -- 755 (www-data) Конфиги ядра для конкретного сайта | |-- errors -- файлы спец шаблонов ошибок | |-- hooks -- спец-ловушки для фрейверка. Нужны для низкоуровневого изменения поведения системы | |-- logs -- 755 (www-data) сюда система пишет свои логи отладки или ошибок | |-- plugins -- плагины конкретного сайта. Могут перегружать глобальные плагины системы. | `-- views -- общесистемные шаблоны | |-- admin -- общесистемный шаблон админ-панели | `-- default -- папка шаблона сайта. Таких папок может быть много |-- modules_vars -- Переменные окружения модулей На примере одного модуля можно показать общуюю струкутру | |-- admin -- Окружение модуля админки | | |-- dynconf -- 755 (www-data) динамически изменяемые конфиги модуля | | |-- language -- языковые файлы модуля | | | |-- english | | | |-- russian | | | `-- ukrainian | | `-- views -- внешние шаблоны модуля. | |....... И теперь папка "смотрящая в мир" `-- www |-- .htaccess -- используя mod_rewrite переопределяет вызовы на index.php |-- index.php -- через этот файл проходят все вызовы и начинается работы системы |-- desert -- папка с ресурсами сайта (может иметь любое имя -- определяется конфигом) | |-- css -- ...понятно из имени | |-- i | `-- js `-- rc -- папка ресурсов админки. Определена через конфиг темы админки. Симлинк на репазитарий. |-- admin -- рекомендуется хранить ресурсы отдельных модулей в отдельных папках | |-- css | `-- imgs |-- components -- компоненты клиентской части | |-- cmenu | |-- dynatree | `-- jedit |-- css |-- imgs `-- js
При детальном рассмотрении заметно сходство с основной структурой папок приложения на базе большинства фреймверков.
Ваша структура может отличаться. Это не может быть идеальным решением, т.к. оно не существует. К тому же, если Вы используете на CodeIgniter, то у Вас, конечно же, масса своих нюансов. Но общий смысл моего совета в шести пунктах я описал в начале заметки.
Что бы добиться такой структуры пришлось допустить пару не желательных хаков на фреймверк, с целью переопределить некоторые маршруты поиска файлов.
Если кто-то не сумеет отыскать их самостоятельно, пишите в комментарии — распишу детальнее.
Update: Забыл подчеркнуть - все определения путей к папкам должны быть описаны в константах, ни в коем случае нельзя использовать непосредственные имена папок в коде!
4 комментария:
папки языков я бы всё же сокращенно писал ru, en, uk и т.п. а то ведь потом придётся сопоставление делать url к языку, например /ru/news/press/ и т.п.
так же css, js, imgs стоит разделить на три вида папок frond, backend и common, в последней лежат общие для всех компоненты, чтобы понятно было и не дублировать
front и backend -- это desert и rc соответственно на схеме.
Имена папок с языками -- разумное замечание, возможно и так.
Но т.к. языками самого сайта (frontend) занимается отдельный модуль, то тут кто во что горазд так и именует.
Мне кажется следует удобней хранить модели в одном репозитории а не в каждом модуле по отдельности, так как несколько модулей могут использовать одну и туже модель, например модель product могут использовать модули best_products и product_detail.
А мне кажется, что best_products и product_detail это части одно и того же модуля и да, там модели лежат рядом.
А вообще, в моей системы была заложена идея общения между модулями через сообщения и подписку на них. Никаких прямых вызовов, т.к. это сильно повышает связность (зависимость).
Но если вы делаете узконаправленное приложение -- вы вольны выбирать любой удобный для вас способ взаимодействия.
Отправить комментарий