Цель этой статьи — поделиться опытом написания простого PHP-фреймворка ООП MVC. Я также хочу предоставить исходный код сообществу и попросить критики, одобрения, комментариев и поддержки.
Введение
По мере использования различных современных фреймворков я понял, что недостаточно понимаю, как всё работает внутри; Я не понимаю, почему разработчики выбрали то или иное решение; Я обращаю внимание только на текущую задачу и не смотрю «выше, глубже и дальше».И, как вариант профессионального роста, я выбрал создание собственного проекта.
Как показала дальнейшая практика: читать, знать, слышать о чем-то и уметь это реализовать самостоятельно – совершенно разные вещи.
Теоретизировать можно бесконечно, но только реальная практическая задача позволит понять, на каком уровне вы находитесь.
В связи с этим началось «написание собственного велосипеда».
Как это получилось, судить вам.
Процесс развития
Разработка фреймворка велась следующим образом: изначально было некое простое веб-приложение, которое дорабатывалось, переписывалось, менялась структура, приобретались новые классы и компоненты и т. д. Несколько месяцев назад у меня появилось свободное время, много энтузиазм и решимость наконец завершить работу над фреймворком — это серьезно».В общей сложности я потратил 3–4 недели на написание этой версии (работая в среднем 1–3 часа в день, 3–4 дня в неделю).
По ходу разработки я сознательно повышал для себя стандарты и требования, искал оптимальные решения и много раз переписывал код. Так, например, работу с настройкой я переделывал 5-6 раз (причём несколько раз радикально), маршрутизацией - 3-4 раза.
В качестве примеров я брал код из статей, публикаций, руководств, фреймворков (Yii2, CodeIgniter, Zend, Phalcon, Bun) и т.д.
Анализ требований
Все начинается с анализа требований и пожеланий к конечной системе.Структура должна:
- позволяют быстро создать сайт с нуля
- иметь ряд уже реализованных базовых технических решений и инструментов
- содержать отдельные интерфейс и серверную часть
- отвечать современным требованиям к коду, технологиям, прикладным техническим решениям и т.д.
- содержать демо-приложение уже в базовом пакете, на основе которого вы можете вести собственную разработку
- быть модульным и расширяемым
- иметь четкую документацию, техническую поддержку (в идеале сообщество)
Используемые технологии
Список таких решений напрямую зависит от того, что вы знаете и что применяете в своей реальной практике.Те.
Мы подходим к необходимости постоянного мониторинга новинок и изменений в ИТ-сфере.
Практики и технологии:
- Язык программирования: PHP > = 5.5.* или PHP > = 7.*
- База данных: MySql > =5.4.*
- Менеджер пакетов: Композитор
- Автозагрузка: ПСР-4 , кодировка: ПСР-2 , Ведение журнала: ПСР-3
- Мы используем функционал языка: пространства имен, черты, магические функции и так далее.
- Мы применяем узоры при построении структуры занятий, выполнении задач
- Мы создаем html-код, используя Твиттер-бутстрап
- Мы используем лучшие подходы к программированию: ТВЕРДЫЙ, СУХОЙ, ПОЦЕЛУЙ, ЯГНИ
- Покрытие кода PhpUnit -тесты (тестирование работы базовых классов приложения)
- мы покрываем функциональность Кодецепция - испытания (приемочное тестирование)
Структура папок
Приведу структуру файлов и папок в фреймворке (код также можно посмотреть на GitHub ):Код
В приложении есть такой единственная точка входа .Вот код файла index.php из общедоступной корневой папки веб-сервера.
Код метода запустить ($ конфигурации) из класса \framework\core\Application() .session_start(); $loader = require(__DIR__ .
'/.
/.
/vendor/autoload.php'); $loader->addPsr4('framework\\', __DIR__ .
'/.
/.
/system/'); $loader->addPsr4('frontend\\', __DIR__ .
'/.
/'); $loader->addPsr4('common\\', __DIR__ .
'/.
/.
/common/'); $config = array_merge( require(__DIR__ .
'/.
/config/main.php'), require(__DIR__ .
'/.
/.
/common/config/main.php') ); $appication = new \framework\core\Application(); $appication->run($config);
Загружаются необходимые классы приложения и вызывается соответствующий контроллер (в методе выполнять() ).
/**
*
* @param array $config
*/
public function run($config = [])
{
$this->benchmark = new Benchmark();
$this->environment = Environment::get();
$this->config = new Registry($config);
$this->response = new Response();
$this->request = Request::getInstance();
$this->assets = new Asset($this->config->assets);
$this->setParams();
$this->router = new Router($this->config->routes);
$this->execute();
}
Код метода выполнять() из класса \framework\core\Application() .
На этом этапе уже выбран необходимый контроллер; мы инициализируем этот контроллер, обрабатываем заголовки и выводим содержимое.
Если есть ошибка, мы отказываемся от нее.
404 Не Найдено .
public function execute()
{
$controllerName = $this->router->getControllerName();
try {
$controllerClass = '\\' .
$this->config->name .
'\controllers\\' .
$controllerName .
'Controller'; if (class_exists($controllerClass)) { $controller = new $controllerClass; if ($controller instanceof Controller) { $controller->setApplication($this)->run(); } } else { throw new CoreException('Controller "' .
$controllerName .
'" not exists: ' .
Request::getInstance()->server["REQUEST_URI"]);
}
} catch (CoreException $e) {
$e->logError();
$this->response->setHeader("HTTP/1.1 404 Not Found");
$this->router->error404();
$this->execute();
exit();
}
foreach ($this->response->getHeaders() as $header) {
header($header);
}
echo $this->response->getContent();
}
Улучшения и планы на будущее
В качестве адаптера для подключения к базе данных я использовал ПДО .За время работы мне PDO не очень нравился — сложно отлаживать запросы, хочется комфорта от использования ORM. Может быть установлен Красноречивый ОРМ — это современное и готовое решение (используется в фреймворке Laravel), к тому же оно хорошо документировано и может быть установлено из композитора за несколько минут. Еще я задумался о расширении базового функционала фреймворка: хотелось добавить поддержку модулей.
Те.
чтобы можно было написать, например, блог как отдельный модуль (со своими контроллерами, просмотрщиками, моделями и т.д.).
А затем подключить этот модуль в любом месте приложения.
Можно расширить базовый «джентльменский» набор классов в ядре, усложнить систему логирования, обработки ошибок, настройки, написать полноценный демо-сайт со всем функционалом и т.д.
Заключение
Буду рад услышать критику кода, архитектуры, исходных требований и т.д. Буду активно читать комментарии и стараться отвечать на вопросы.Я также хотел бы реализовать любой проект на основе этого фреймворка.
Так сказать, опробовать инструмент в работе.
Понятно, что поиск клиентов вообще не относится к этому разделу, но хотелось бы услышать, можно ли с этим решением запустить реальный проект? Популярные фреймворки «из коробки» обеспечивают функционал в 50-100 раз качественнее и больше по масштабу, с ними сложно конкурировать.
→ Код на GitHub Теги: #MVC #framework #php #cmf #Разработка сайтов #php
-
Заведите Блог Бесплатно, Но Что Потом?
19 Oct, 24 -
Тестирование Мобильного Клиента Vzochat
19 Oct, 24 -
Экстремальное Именование Доменов
19 Oct, 24 -
Sialex - Новая Социальная Поисковая Система
19 Oct, 24