Портал Belkin-labs»PHP классы»Статья
welcome!

Файловая структура сайта - объектно ориентированный подход

Эта статья является частью проекта "Разработка сайта: объектно-ориентированный подход" и может быть интересна тем, кто рассматривает возможность создания сайта с использованием разработанного мною PHP-тулбокса, или уже является моим партнером.

Здесь изложены требования к структуре сайта и наименованию отдельных файлов. Требования эти желательны, но необязательны, ибо мы тут имеем дело не с движком, реализующим отдельные функции, а с тулбоксом, то есть, в общем случае набором классов. Но следует иметь ввиду, что в случае принятия другой структуры, многие классы (даже базовые) могут потребовать изменений в плане значений по умолчанию.

Что есть наш будущий сайт

Сайт, который мы можем сделать с использованием описываемого тулбокса, довольно универсальный и потенциально удовлетворяет большому количеству требований. Их нужно иметь ввиду, ибо от их удовлетворения зависит очень многое, причем зависит концептуально.

  • Сайт является порталом, то есть набором доменов. В дальнейшем повествовании я постараюсь называть отдельные домены доменами, но по сложившейся традиции могу назвать домен сайтом. В этом случае надо иметь ввиду, что весь проект, как объединение доменов (сайтов) я обычно называю всегда порталом.
  • Существует основной домен, который "отзывается" на URL типа http://domen2.ru/, и существуют второстепенные сайты (пример: мобильная версия основного домена), которые "отзываются" на УРЛы типа http://domen3.domen2.ru/. Цифра в наименовании домена олицетворяет уровень доменного имени. В реальности это может быть адрес http://m.domen2.ru/.
  • Предложенная структура не отрицает наличия доменных папок, то есть, УРЛов типа http://domen2.ru/folder/. Устройство сайта в виде отдельных доменов часто бывает выгодно, если содержимое различных поддоменов не пересекается и мы не хотим, чтобы читатель, который заходит на сайт за телефонами, видел, что мы продаем еще и одежду.
  • Админка сайта может быть реализована одна на все домены и тоже может существовать в виде поддомена. Например, http://admin.domen2.ru/. Но может быть реализована и в виде папки и для каждого домена отдельно. Например, http://domen3.domen2.ru/admin/.
  • Весь портал использует одну базу данных. Это не требование. Это просто удобно, ибо тогда будет легче использовать для различных поддоменов (сайтов) универсальные классы уровня проекта (этот термин будет рассмотрен далее).
  • Все домены используют переименования УРЛов. По умолчанию принято наименования УРЛов в виде папок с наличием винального слеша. Урлы страниц с расширениями не допускаются. Это принятое в системе требование безопасности. Обращение к какой-то странице по названию файла с расширением ".php", например, сразу влечет подозрение во взломе. Вообще, безопасность - особая тема и будет рассмотрена особо.
  • Концепция тулбокса жестко завязана на использование копии сайта на локальном хосте. Мы делаем и отлаживаем сайт на локальном хосте, затем копируем новые файлы на удаленный хост. При этом мы ничего не меняем в тех файлах, которые копируем. В этом суть! Реализация и доведение до ума именно этой возможности отняла у меня довольно много времени.

Почему портал является объектно-ориентированным?

Потому, что он сделан с использованием объектно-ориентированного подхода (ООП). Этот факт находит отражение в файловой структуре сайта.

Существует довольно объемный по составу и функциям набор базовых классов. Именно эти классы и составляют тулбокс, основную его часть. Очевидно, в этом наборе есть не только базовые классы. Там есть и абстрактные классы, и трэйты, и даже несколько интерфейсов. Есть даже вполне работоспособные классы (не абстрактные). Все эти классы не предназначаются для редактирования кем бы то ни было, кроме его автора, то есть меня. Да и я тоже избегаю их редактировать, ибо в случае глубокого редактирования базового класса приходится изменять всю существующую ветку переопределений. Так что я в таких случаях предпочитаю создавать отдельный класс и использовать его. Но это бывает крайне редко.

Наряду с базовыми классами есть классы проекта и классы отдельного домена, или сайта. Именно в этой структуре наследования классов и состоит главное зерно (изюм) тулбокса и заложенного в нем подхода.

Очевидно, если у нас проект состоит из одного сайта, то и уровня сайта нет. Обходимся уровнем проекта. Например, сайт belkin-labs.ru содержит довольно много сайтов, больше 10-ти. Если взять разницу между мобильными сайтами и десктопными, то она довольно существенна. Такая разница заложена в переопределения классов уровня проекта. Если рассматривать разные десктопные сайты, то они довольно сильно друг на друга похожи. Отличаются только цветом. Такие изменения закложены в уровень сайта.

Стоит сказать,
что в этом подходе нет ничего особенного и совершенно никакой новизны вообще, ибо именно так происходит процесс программирования с точки зрения тех, кто выдумывал язык PHP. Но к сожалению, и я тут делаю вывод на основании тех сайтов, которые поддерживаю, другие программисты предпочитают использовать другие методы программирования, часто выдумывая свои собственные. Может это и не так и мне просто всегда "везло" с такого рода сайтами. По крайней мере, я еще ни разу в жизни не видел сайт, полностью отвечающий ООП. Последнее время на сайтах стали появляться классы, но они используются чаще всего только для инкапсуляции кода, то есть более современная замена старым добрым процедурным модулям и статическим переменным уровня файла.

Файловая структура портала

Весь портал, все его папки и домены, располагаются в одной папке. Пусть она называется "/htdocs".

Папка "/htdocs" - основная папка портала

Здесь не содержится никаких исполняемых скриптов. Здесь находятся следующие папки:

  • "/core_classes" - набор базовых классов. Это неизменяемые классы. Это особая папка. Уточнение по ее особенности отражены в заключении к этой статье.
  • "/PRJ_CONFIG" - Несколько конфигурационных файлов уровня портала. Они вынесены в отдельную папку по соображениям безопасности (отдельный файл .htaccess) и по соображениям удобства. Разговор о них будет впереди.
  • "/PRJ_CLASSES" - набор классов уровня портала. Многие из них, и это практически правило, являются наследниками того или иного базового класса. Классы, которые находятся в этой папке используются либо прямо так, как есть, либо в качестве родителей (базовых классов) для классов отдельных доменов.
  • "/css" - исходники файлов с css-стилями уровня проекта. Файлы из этой папки полностью закрыты для всех. Они используются только для создания кэша.
  • "/js" - исходники файлов с js-скриптами уровня проекта. Файлы из этой папки используются для создания кэша в случае работы на удаленном хосте и загружаются прямо отсюда в несжатом виде при работе на локальном хосте. Очевидно, все это настраивается. Если на проекте используется какая-нибудь библиотека (jQuery), то она именно здесь находиться должна.
  • Одна или несколько папок доменов. Все они имеют подчеркивание в качестве первого символа. Это важно! По этому подчеркиванию мы опознаем функцию папки. Удобно называть эти папки по домену третьего уровня. Так папка основного мобильного домена может называться "/_m". Основной домен тоже должен иметь какое-то название, хоть у него и нет домена третьего уровня. Ну пусть его папка будет называться "/_site". В последнее время мне оказалось удобным некоторые вещи, одинаковые для всех доменов, хранить на особом домене, полностью закрытом от индексации. В этом случае последние две указанные папки либо пусты, либо отсутствуют.

Папка домена третьего уровня "/_site"

Папка основного домена по своим функциям совпадает с папкой домена третьего уровня. Просто скрипты, которые в ней находятся, обрабатываются с учетом того, что это основной домен.

  • "/SITE_CONFIG" - Несколько конфигурационных файлов уровня домена. Папка некоторым образом аналогична папке "/PRJ_CONFIG". Слово "SITE" в названии папки может быть связано с тем, что название доменной папки "/_site", а не какое-то другое. Но здесь можно действовать (называть эти папки) так, как будет удобнее тому, кто создает портал.
  • "/SITE_CLASSES" - набор классов уровня домена. Это уже в большинстве рабочие классы и обычно они не предназначены для использования в качестве родителей.
  • "/css" - исходники файлов с css-стилями уровня домена. Файлы из этой папки полностью закрыты для всех. Они используются только для создания кэша.
  • "/js" - исходники файлов с js-скриптами уровня домена. Файлы из этой папки полностью закрыты для всех. Они используются только для создания кэша.
  • "/fcache" - папка кэша уровня домена. В админке реализованы средства для управления кэшем всех доменов с одной страницы. Файлы стилей и
  • "/fake_letters" - папка писем уровня домена. Этой папки НЕТ на удаленном хосте. Она есть только на локальном. Она используется для отладки тех писем, которые получают (могут получать) клиенты сайта или администратор сайта.

Кроме указанных, в папке домена могут быть и другие папки, которые нужны для работы домена. Например, "/images". Названия этих папок не регламентируются тулбоксом.

Если домен имеет папки, например, админка находится в папке "/admin", то такого рода папки тоже находятся в папке домена.

Конечно,
плохая идея называть папку "/admin". Разговор о безопасности будет большой, и он будет впереди, а пока примем это название для наглядности.

Заключение

Больше не хотелось бы здесь говорить о файловой структуре портала, чтобы не загружать документацию излишними деталями. Хотя сказать есть очень много еще чего!

В заключение стоит отметить особую роль папки "/core_classes". Дело в том, что у меня на локальном хосте (именно на нем !) находится в разработке несколько проектов, основанных на описываемом тулбоксе. Очевидно, что все проекты пользуются одной папкой с базовыми классами. Таким образом, папка основных базовых классов находится ВНЕ какого-либо проекта. А на удаленном хостинге эта папка в огромном большинстве случаев принадлежит проекту, то есть, находится в его структуре.

Эта особенность вносит некую турбулентность (сложность) в стройную структуру портала. Приходится помнить ее и обрабатывать ее особо на уровне создания конфигурационных констант на уровне проекта.

Автор описываемого PHP-тулбокса
Дмитрий Белкин

Статья создана 13.12.2014
Похожие материалы - отбираем по ключевым словам