1.3. Собираем наш PHP фреймворк
Есть много различных путей для конструирования фреймворка. Кто-то предпочитает очень сложные фреймворки, кто-то очень простые. В наших статьях мы собираемся быстро собрать простой в использование и простой в понимание фреймворк.
Наши статьи помогут Вам разработать свой фреймворк, отличающийся от того что нужен нам для создания интернет магазина, вы сможете легко добавить другие части к фреймворку для создания чего-то большего. Главная цель цикла статей научится делать свой собственный фреймворк для любых CMS.
Паттерны (Patterns)
Для разработки фреймворка применяются различные шаблоны проектирования приложения Паттерны. Паттерн - это наиболее удачные решения и практики, решающие общие задачи связанные с разработкой программ. Среди паттернов мы будем использовать следующие:
- Модель-Вид-Контроллер (MVC, Model-View-Controller)
- Реестр (Registry)
- Еденичный класс (Singleton)
Модель-Вид-Контроллер (MVC)
MVC - это основа нашего фреймворка, предоставляет нам решение для разделения пользовательского интерфейса и логики нашего приложения. Пользовательский интерфейс (View) взаимодействуют с моделями данных (Model), используя контроллеры (Controller), которые в свою очередь содержат необходимую бизнес логику для управления данными в моделях.
Например когда пользователь нажимает на Добавить в корзину в Виде (view), контроллер обрабатывает этот запрос и взаимодействует с моделью корзины и добавляет товар в корзину. Обычно данные из модели корзины возвращает обратно контроллеру сколько товаров на данный момент в корзине и показывает новую корзину с новым количеством товаров.
Мы будем использовать свой фреймворк и сможем расширять возможности на основе MVC. Как описывалось ранее данные представлены в моделях, сами данные распалагаются в базе данных. Однако модели и таблицы в базе данных находятся в одинаковом формате (поля в моделях совпадают с полями в таблицах). Так что мы можем расширить нашу даиграму MVC. Мы также видем конечный результат, который обрабатывается в View отображается в браузере, так что добавим и его в диаграму.
Реестр (Registry)
Реестр предоставляет возможность хранить коллекцию объектов нашего фреймворка. Необходимость в Реестр возникает из-за абстракции связанной с MVC паттерном. Каждый контроллер и модель (например товар, корзина, страница) нужен чтобы выполнять общих задач, включая:
- Запросы к БД
- Проверка авторизовался пользователь для получения нужной информации
- Отправка данных на View (управления шаблонами)
- Отправка емайлов, например при покупке товара на сайте
- Взаимодействие с файловой системой, например загрузка фотографий для товаров.
Большинство систем и фреймворков выполняют эти функции в объектах и мы будем создавать такие объекты. Реестр позволяет хранить эти объекты вместе. Реестр может быть вызван из любого места в фреймворке и предоставляет для этого доступ к своим функциям. Вот примерная диаграма нашего Реестра.
Фреймворк взаимодействует с Реестром напрямую, когда нужно предоставляет доступ остальным объектам. Внутри Реестра объекты могут также взаимодействовать друг с другом, например менеджер шаблонов может быть связан с файловым менеджером, емайл отправитель связан с емайл шаблонами.
Единичный класс (Singleton)
В русском языке сложно найти обозначение singleton, поэтому у нас будет Единичный класс, но в основном в документации пишут синглетон или просто на английском singleton. Возможно писать лучше на английском (наверняка, но у нас будет единичный класс).
Единичный класс – один из самых простых шаблонов для понимания. Основное назначение – гарантировать существование только одно экземпляра класса. Причиной обычно является следующее: требуется только один объект исходного класса и Вам необходимо, что бы объект был доступен в любом месте приложения, т.е. глобальный доступ.
Единичный класс используется, когда у класса только одно предназначение. Например, настраивать соединение с базой данных, чтобы остальные объекты могли взаимодействовать с БД.
Общая структура
Следующий шаг к разработке нашего фреймворка это планирование структуры. Мы должны создать структуру для:
- Моделей
- Видов (Чтобы мы могли интегрировать возможность переключать стили сайта в нашем фреймворке, так чтобы для одного стиля была отдельная папка)
- Контроллеров (Чтобы мы могли хранить контроллер в отдельной папке, если мы захотим добавить функционал, нам нужно было только добавить новую папку с контроллером)
- Контроллера админа (мы создаем не только фреймворк, но и CMS, поэтому нужно предусмотреть, чтобы информацию на сайт могли вносить модераторы и админы)
- Реестра
- Объектов реестра
- Загружаемых файлов
- Сторонних библиотек
- Другого кода
Принимая во внимание структуру фреймворка папки нашего фреймворка должны быть такими (мы будем использовать английские названия папок, потому что так принято в PHP):
- Models
- Views
- View A
- Templates
- Images
- JavaScript
- Controllers
- Controller A
- ControllerA
- ControllerAAdmin
- Controller A
- Registry
- Objects
- Database objects
- Assets
- Uploads
- To be expanded when we add products and images to our framework!
- Libraries
- Miscellaneous