Я начинаю цикл статей о профессиональном создании сайтов на PHP и jQuery. Речь в этой рубрике пойдет о создании своего фреймворка, собственной CMS на его основе и компонента интернет-магазин для нее.

Во-первых, зачем? На свете существуют уже, наверно, тысячи или даже сотни тысяч всевозможных фреймворков, маленьких и больших, сложных и простых, голых или уже оформленных в виде CMS, а некоторые из них, появившиеся как раз благодаря CMS, например таких, как Joomla или OpenCart. Куда еще создавать? Да все туда же - для себя любимых. Как говорится, сколько программистов, столько и движков. Чтобы во фреймворке не нужно было разбираться по мануалам и скучным примерам "Создаем блог", чтобы при необходимости не нужно было гадать, а предусмотрена ли соответствующая функция/метод/плагин/конфиг в нем и лезть в обширные доки, изучая понапиханное авторами как новый язык. Наконец, чтобы держать все возможности и преимущества фреймворка в голове, а о скользких местах не думать, устраняя их по мере выявления, заточкой фреймворка под текущие задачи.

Во-вторых, почему? А потому что однажды понадобилось мне создать один серьезный проект, который не должен быть обвешен лишними библиотеками, перегружающими память при любом удобном случае и потому что совершенно нет желания изучать дополнительные языки программирования, которыми представляются мне современные всефункциональные фреймворки вроде Yii, Kohana, CodeIgniter или, прости господи, Zend Framework. Кстати, первоначальной идеей было работать на Yii , однако после прочтения небольшого руководства по созданию "Первого приложения" и даже установки на Denwer (не без проблем) с небольшим копошением в коде, желание продолжать довольно быстро улетучилось, поскольку разработка приложения свелась практически только к изучению Yii framework. Понятное дело, что создавая свой фреймворк придется пройти практически через все тернии, и потратить гораздо больше времени на изучение современных тенденций решения кодотворческих задач, их реализацию, вылавливание собственных слишком и не слишком глупых ошибок, отыскать пути решения задач, которые давно уже найдены и отражены кодотворцами, однако таков путь к звездам :) Вот соображения "За". Все соображения "Против" отметаем ну просто так.

Оговорюсь, что для дальнейшего понимания приводимых решений вы уже должны владеть хотя бы основами программирования на PHP, более-менее уметь верстать сайты на HTML и CSS, а также иметь представление о javascript-фреймворках (я буду применять jQuery).

Делать будем на общепринятой и широкораспространенной модели MVC (Model-View-Controller).

Пару слов о схеме фреймворка - MVC (Model-View-Controller). Эта схема позволяет просто и эффективно разделить веб-приложение на ключевые составляющие: данные (Model, модель), логика (обработчики данных - Controller, контроллер) и дизайн (через представления или шаблоны - View, вид). При такой схеме проектирования веб-приложения мы получаем приятно перевариваемую и понятную программу, а не ужасающий лапшекод из PHP и HTML, который чем дальше развивается сайт, тем ужаснее.

В качестве отправной точки я взял статью на http://www.phpro.org Первоначально было принятно не обращать внимание на то, что автор статьи предпочитает схему Controller-Action-View, исключая из нее отделенное звено Model. Но в последствии я реализовал непосредственно в ядре фреймворка схему Controller-Action-View, а звено Model вынес в подключаемую библиотеку, поскольку логически в простейших виртуальных визитках и небольших сайтах наличие концепции отдельных моделей, малых или больших, совершенно необязательно.

Постараемся воплотить в нашем движке самые полезные и распространенные техники, которые присутствуют в полюбившемся мне фреймворке, лежащем в основе очередных версий движка интернет-магазина OpenCart, в простом фреймворке TinyMVC от автора известного PHP-шаблонизатора Smarty, ну и, безусловно, во фреймворке Joomla. Возможно, что-нибудь подсмотрим в Fat Free. Впрочем, если большинство техник будет своих-родных, так оно и лучше тогда.

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

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

Я назову свой фреймворк VMVC (VM-первые буквы моего имени латинницей Vadim и фамилии Malkov, остальное - VC (View-Controller).

Можно воспользоваться классической схемой построения каталогов. В папке controllers разместить файлы контроллеров (обработчиков данных), в папке views - шаблоны для отображения сайта и данных, а в папке models - модели (часто это наборы классов для работы с различными таблицами базы данных). Однако мой опыт и некоторые реинкарнации фреймворка в прошлом показали, что удобной структурой каталогов будет такая:

/ (корневая папка аккаунта на хосте) 

/vmvc/ (файлы фреймворка)
/core.php - ядро фреймворка
/lib/ - папка доп. библиотек, которые могут потребоваться в большинстве приложений: реализация модели, класс для работы с БД (подключение и т.д.), классы для работы с почтой, сессиями и т.д.
/www/ (файлы и папки, доступные из веба: картинки, Javascript-библиотеки, css)
/app1/ (файлы моделей, контроллеров, видов, плагинов, относящиеся к приложению app1)
   /controller1/ (папка одного из контроллеров, например, users, можно называть ее папкой компонента users, но по сути она будет грузиться тогда, когда вызывается контроллер users)
controller1.php - файл контроллера, например, users.php
model1.php - файл модели. Удобнее будет называть по имени компонента/контроллера, чтоб не путаться потом между папками в редакторе кода, когда их будет с десяток. Например, usersModel.php
   /controller2/ папка другого контроллера
   /templates/ папка шаблонов. В конфигурационном файле предусмотрим возможность задания имени этой папки.
template.php - главный шаблон-контейнер. В конфигурационном файле предусмотрим возможность задания имени этого файла.

/views/ - папка с представлениями. Здесь будут храниться подшаблоны для основной части шаблона у различных страниц сайта: страница Контакты, О проекте, Статьи, Объявления и т.д. На большинстве страниц сайта львиная доля блоков не меняется (шапка, подвал и колонки), а меняется только центральная часть. Вот для нее нам и нужны /views/ . Можно также предусмотреть иное ее название в конфиге сайта, например, pages. Это не так важно.
controller1_index.php - файл представления по-умолчанию (например, articles_index.php, если на домашней странице мы решим отображать список статей, или index_index.php , если для главной у нас будет отдельный контроллер)
controller1_action1.php - например, index_contacts.php - файл представления контента на странице контактов.

/blocks/ - папка с представлениями блоков. Здесь разместим маленькие подшаблоны для различных частей главного шаблона (страницы). Например, форму логина или подписки на рассылку.

/includes/ - здесь у нас будут дополнительные файлы библиотек, которые могут потребоваться в данном конкретном приложении. Например, автозагрузчик моделей, функция формирования заголовков страниц, обработчик отправки форм на сервер и т.д.

/hooks/ - здесь мы разместим хуки-плагины - доп. обработчики данных и шаблонов, которые срабатывают в определенный момент.
 /app2/ (файлы моделей, контроллеров, видов, плагинов, относящиеся к приложению app2)

В обычном случае, папка vmvc на этапе разработки приложения трогаться не должна. Трогаем мы ее только тогда, когда обновляем/дорабатываем сам framework. С помощью фреймворка мы должны иметь возможность разделять работу над различными приложениями: блогом, форумом, гостевой книгой, социальной сетью, интернет-магазином и т.д. Под каждое приложение удобно выделить свою папочку. Конечно, одно приложение может быть создано в рамках другого, например, форум под интернет-магазином или гостевая для блогового сайта. Поэтому разбиение проектов на приложения и их каталогозация у нас будет нестрогой. В простом случае, обязательно иметь всего одну папку приложения и писать весь код в ней.

В папке приложения можно разместить и малые контроллеры - например, контроллер ошибки 404, и большие - компонент(контроллер) форума.

Папка lib обязательно нам понадобится для расшаривания общих файлов классов и функций, которые могут пригодиться при реализации нескольких проектов. Например, функции с правилами роутинга, авторизация, разделения ролей пользователей, кэширование и т.п. Папка www или, возможно, domain.com - та папка, в которой будут находиться ресурсы, доступные всем посетителям сайта. Файлы css-стилей, библиотеки javascript, файлы, загруженные пользователями сайта и, конечно, входной скрипт index.php. С него и продолжим в следующей статье.

Наверх