Свой PHP фреймворк для своих проектов и не только
Доброго времени друзья! Каждый раз когда возникает вопрос о разработке очередного интернет проекта, будь то информационный портал или специализированный сервис, встает вопрос о том, какой PHP фреймворк или CMS выбрать за основу для его создания. Решение должно подбираться исходя из характеристик будущего проекта, удачно подобранное решение позволит в будущем существенно сэкономить на обслуживании и масштабировании проекта, и речь не только о деньгах, но и о затратах времени и сил, которые могут потребоваться для решения вновь поставленных задач. Почти десять лет назад, я занялся разработкой своего собственного PHP фреймворка, который писался для моего первого проекта, который делался, как говориться «с нуля», им был сайт-биржа прогнозов на спорт. Проект был огромен, и уже тогда я заложил в свой фреймворк возможность масштабироваться, без каких либо существенных на то ограничений. Уже первая версия фреймворка имела админпанель, набор полезных библиотек, структуру MVC, а также логичную структуру файлов и папок. Далее я расскажу обо всем подробнее.
Собственный PHP фреймворк
Когда я только задумался о написании своего фреймворка, я решил посоветоваться с опытными программистами, своими товарищами, которые работали не только с PHP, но и с JS, Java, C++. Разумеется в ответ я услышал море критики, скептицизма, призывов к здравомыслию, советов не изобретать свой велосипед и т.д. Мол проще взять готовое решение и на его основе реализовать проект. Разумеется в чем-то они были правы, но если учитывать то, что кроме создания одного единственного проекта, в мои планы входило также изучить как можно глубже PHP, погрузиться в архитектуру различных CMS, почерпнуть интересные идеи, а потом попробовать реализовать все это в своем, ином, видении и самое главное — положить надежную основу всех моих будущих проектов, то моя затея была, на мой взгляд, стоящей! И я приступил к его написанию.
И самое главное, по прошествии стольких лет с момента создания первой версии, я ни разу не пожалел о проделанной работе, ведь на основе своего фреймворка я разработал не один проект, а десятки, более того фреймворк лег в основу моих коммерческих продуктов CMS Совместные покупки, CMS Автопортал, CMS Семейный портал, CMS Спорт прогнозы, CMS OsRealty Недвижимость, несколько SAAS проектов, в том числе стартап для SMM специалистов(о котором я расскажу позже). А сколько было создано на его основе отдельных небольших решений для бизнеса, различных скриптов, калькуляторов и инструментов, включая даже парсеры. Мои работы на основе моего PHP фреймворка разошлись десятками и сотнями копий, и за все время(почти десять лет), я получил лишь с десяток писем, где пользователи говорили о том, что не смогли понять его архитектуру, но после нескольких подсказок, как правило вопросов больше не оставалось. А вот писем с конструктивной критикой, благодарностями, пожеланиями и предложениями, было куда больше.
Несколько раз ко мне обращались люди из других стран: Украины, Грузии, Армении, Казахстана, Греции, Израиля, за доработками их сайтов, проектов, сервисов, в основу которых был положен разработанный мною PHP фреймворк. Самое интересное то, что в ряде случаев, моя разработка была подписана авторством другого человека(я такой подход не приветствую), очевидно тем кто занимался разработкой проекта для этих людей изначально, но потом куда-то слился. Несколько раз я видел проекты, где все русские текста, содержащиеся в коде моего фреймворка были переведены на другие языки(например грузинский). Учитывая то, что мой фреймворк никогда не был общедоступен и поставлялся только с какими-то моими разработками, и при этом был кем-то взят за основу в какой-то своей работе, было для меня неожиданным, но в тоже время интересным и приятным. Пользователи находили мои контакты в коде фреймворка, в библиотеках, в шаблонах админпанели и писали мне.
Первая версия была достаточно простой, но уже имела MVC, понятную структуру маршрутизации и ЧПУ, а также набор всех необходимых классов и библиотек. Со временем я улучшал фреймворк, писал свои классы, пополнял набор полезных функций, изменял библиотеки, так появлялись его новые версии. И я до сих продолжаю поддерживать его и развивать.
Функционал
Мой PHP фреймворк достаточно прост, в нем нет ООП парадигмы, но реализована MVC (Модель, Представление, Контроллер). Контроллер это ядро, отвечает за подключение нужных классов и библиотек, подключение к БД, обработку запроса, роутинг и подключение модели с последующим подключением и выводом представления, в зависимости от выбранного раздела, страницы сайта. Единая точка входа index.php. Роутинг адресов страниц можно настроить через .htaccess, конфигурирование nginx или задать в самом скрипте PHP, в зависимости от предпочтений, возможностей и потребностях в производительности. Предусмотрено кеширование запросов к БД, простая защита от ДДОС, возможность дебага с удобным выводом отладочной информации.
Модель объединяет в себе логику работы в рамках одного раздела, части системы, одной единицы объекта мира. Также в модели производится работа с базой данных, выполняются запросы выборки, вставки, обновления и удаления. Также модель отвечает за верификацию входных данных, которая реализована достаточно просто но эффективно, привидение к нужному типу, экранирование и т.д.
Представление содержит HTML шаблоны, в которые передаются результаты работы модели и контроллера. В качестве шаблонизатора используются шотр-теги PHP(с целью лучшей производительности), но без проблем можно подключить любой другой шаблонизатор Smary, Twig, Blade и т.д. В зависимости от потребностей, я использую такие CSS фреймворки как Bootstrap или Semantic UI.
Структура каталогов интуитивно понятна, админпанель вынесена в отдельную папку и доступна по адресу ./partner. Остальные папки ./lib — набор библиотек и классов, ./theme — папка содержащая тему(модели и представление), а также CSS, ./upload — загружаемые данные, изображения и прочее, ./cache — папка содержащая кеш запросов к БД и прочих операций.
Так как фреймворк включает в себя готовую админпанель(Backend), его можно также назвать CMS(Content Management System) — Система управления контентом сайта. Взяв его за основу, достаточно реализовать только бизнес логику и Frontend сайта.
Админпанель и функционал
Формы — входа, авторизации восстановления пароля.
Настройки — в которые можно вынести любые настройки сайта, проекта.
Пользователи — Список пользователей, карточка пользователя, добавление, редактирование, удаление.
Страницы(новости, статьи, информационные страницы) — Список страниц, карточка пользователя, добавление, редактирование, удаление.
Категории страниц — Поддержка подкатегорий, ЧПУ.
Меню на сайте — Создание и редактирование меню. Вставка меню по шорт тегу в код шаблона сайта.
Раздел SEO — Настройка мета тегов для страниц и разделов сайта.
Резервное копирование базы данных — Создание и сохранения на диск копий БД, с возможностью скачивания.
Комментарии — Управление комментариями, модерирование.
Опросы — Создание и проведение опросов на сайте.
Рассылки — Осуществление массовой рассылки на емаил пользователям сайта.
Реклама — Размещение и управления блоками рекламы на сайте.
Создание новых разделов, простая тривиальная задача, которая решается очень просто — достаточно скопировать любой базовый раздел сайта, в новую папку раздела, и незначительно изменить код — поменять название таблицы БД, с которым работает раздел, а также его текстовое содержание.
Описание набора классов
Access — Класс обеспечивающий авторизацию и регистрацию на сайте, а также позволяющий работать с данными пользователя.
Antiddos — Класс обеспечивающий защиту от DDOS атак на уровне скрипта. Разумеется серьезной защитой он не является, но позволяет отсечь нежелательный трафик и небольшие атаки, на практике несколько раз был полезен.
Cache — Работа с кешем. Можно поместить в кеш любые данные, объекты и массивы.
DBSql — Работа с базой данных MySQL. В последней версии класса реализовал работу с PDO, переход на PHP 7.
Dbug — Вывод содержимое переменных в удобном, читаемом формате, удобный инструмент для отлаживания скриптов.
GetImage — Загрузка изображений средствами CURL с удаленного сервера, с проверкой MIME Type и сохранением на диск.
ResizeImage — Изменение размеров изображений, наложение водяного знака.
IDNA Convert — Работа с кириллическими доменами, преобразование в PunyCode и т.д.
Mail — Отправка почтовых сообщений по средствам PHP Mail или SMTP.
PCLZIP — Работа с ZIP архивами. Архивация, распаковка, навигация внутри архива.
RSS — Генерация RSS ленты.
SEOName — Генерация ЧПУ URL из кириллической строки текста.
Timer — Подсчет времени выполнения скрипты с учетом времени затраченного на выполнение запросов к БД, удобно для отладки.
Библиотека функций — Большая библиотека полезных функций.
Описание набора библиотек
TinyMCE — WISIWIG редактор, не самая новая версия но бесплатная.
Semantic UI — CSS фреймворк для создания переносимых интерфейсов.
jQuery — Библиотека JavaScript, фокусирующаяся на взаимодействии JavaScript и HTML.
jQuery UI — Библиотека на основе jQuery, реализующая более 20 плагинов.
Fontawesome — Набор шрифтов для выводя красивых иконок.
Заключение
Почему я продолжаю использовать свой фреймворк в своих проектах и в некоторых проектах моих клиентов? Разумеется он не идеален, во многом уступает популярным, общедоступным решениям, имеет как плюсы так и минусы. Но, во первых это быстро — я могу за считанные минуты развернуть готовую платформу на сайте и приступить к написанию бизнес логики. Во вторых —у меня есть уже множество готовых модулей для него, возможно какие-то из них, также будут использованы в очередном новом проекте. В третьих — я написал его сам, и соответственно знаю в нем абсолютно все, а это в свою очередь позволяет вносить изменения с максимальной скоростью. Кроме того, это позволяет мне, реализовать любые идеи и пожелания клиентов, опять же — в самый короткий срок. В четвертых, это скорость — скрипты не содержат лишний код, уровни абстракции, не нужные интерфейсы, шаблонизаторы — все что не используется в проекте, легко удаляется из кода.
Мой фреймворк имеет открытый исходный код и любой разработчик может продолжить работу с ним, независимо от меня. Что касается документации, то она не богата, но в тоже время и фреймфорк не столь сложен чтобы в нем не разобраться, к тому же он снабжен комментариями по коду. Но, а если сложности возникнут, я всегда рад дать подсказку!
Но как и говорил ранее, под каждый проект, должен подбираться инструмент который лучше всего подходит, как для самого проекта, так и для разработчика и клиента. Стоит учитывать функционал, масштаб проекта, его будущий путь развития, а также то, кто будет работать с ним после вас.
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Обзор Insurance CMS — платформы для сайтов по страхованию к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2025 (3)
- Январь 2025 (3)
- +2024 (35)
- Декабрь 2024 (7)
- Ноябрь 2024 (13)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Плагин WordPress для настройки robots.txt 13.01.2025
- Скрипт проверки товара на оригинал (для WordPress и прочих) 08.01.2025
- Флаги Apache при переадресации RewriteRule 02.01.2025
- Интеграция сайта(ресторана) с API сервиса Quick Resto 23.12.2024
- Шифрование в PHP и расшифровка в JavaScript по ключу 15.12.2024