Простой Современный Фреймворк Mvc На Php Для Разработки Веб-Сайтов С Нуля.

Цель этой статьи — поделиться опытом написания простого 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 ):

Простой современный фреймворк MVC на PHP для разработки веб-сайтов с нуля.
</p><p>



Код

В приложении есть такой единственная точка входа .

Вот код файла index.php из общедоступной корневой папки веб-сервера.

  
  
   

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);

Код метода запустить ($ конфигурации) из класса \framework\core\Application() .

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



/** * * @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

Вместе с данным постом часто просматривают: