Есть исключения - микрофреймворки по типу Silex, Lumen, и т.д. однако они заточены под использование компонентов фреймворка из которого они выросли.
Я предлагаю другой подход... Использовать ядро, которое объеденит необходимые, и главное знакомые разработчику, библиотеки в один фреймворк. Обеспечить одну точку доступа к библиотекам из основного веб-приложения, при этом не создавать жестких зависимостей.
Разработаное ядро CodX имеет:
[*] Автозагрузчик скриптов
[*] Регистратор анонимных функций
[*] Регистратор свойств ядра
[*] Роутер
Разберем пункты на примерах.
Для начала необходимо создать экземпляр ядра.
$codx = new CodX();
Так уж повелось, что для глобальных настроек приложения, обычно используется отдельный класс реестр, и файл конфигураций, куда прописываются различные настройики ядра или приложения. В CodX этой необходимости нет. Если нам необходимо создать конфигурационную переменную, воспользуемся регистратором свойств ядра. К примеру зарегистрируем имя проекта:
$codx->project_name = 'Super site';
Или зарегистрируем доступ к БД, без использования класического синглетона, который уже стал антипатерном.
$db_type = 'mysql';
$db_host = 'localhost';
$db_user = 'test';
$db_passwd = 'test';
$db_name = 'test';
$db_charset = 'utf8';
$dsn = $db_type . ":dbname=" . $db_name . ";host=" . $db_host;
$options = array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'' . $db_charset . '\'');
$codx->pdo = new \PDO($dsn, $db_user, $db_passwd, $options);
Подключение библиотеки к ядру осуществляется с помощью регистратора анонимных функций. К примеру нами была написана библиотека работы с сессиями, которая удачно показала себя в работе и на наш взгляд является удобной в пользовании. Зарегистрируем её в ядре
$codx->session(function(){
return new MySession();
});
Допустим мы используем библиотеку (например FluentPDO), которая использует подключение к БД через PDO. Это подключение мы объявили раннее. Зарегистрируем эту библиотеку.
$codx->db(function () use ($codx) {
$db = new FluentPDO($codx->pdo);
return $db;
});
Следует отметить, что имена свойств и методов произвольные за исключением некоторых зарезервированых:
$codx->collection; // Коллекция методов ядра.
$codx->vars; // Коллекция свойств ядра.
$codx->addMethod(); // Метод регистрации анонимных функций.
$codx->autoload(); // Метод регистрации автозагрузчика.
$codx->run(); //Запуск приложения
Зачастую библиотеки имеют собственные пространства имен и собственный автозагрузчик со своими правилами подключения скриптов. И для использования библиотеки необходимо инициализировать этот загрузчик. С CodX, дабы не нарушать общий стиль программирования, можно создать правила подключения скриптов методом autoload():
$codx->autoload(function ($class) {
$base_path = __DIR__;
$file = $base_path . '/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
include_once $file;
}
});
Для того, чтобы наше приложение правильно работало, необходимо соблюсти порядок сборки ядра. В начале необходимо зарегистрировать автозагрузчики, после них регистрируем свойства, затем функции доступа к библиотекам. Тут следует обратить внимание, что если одна библиотека будет зависить от другой, то зависимую следует регистрировать после той, от которой она зависит.
После того, как ядро собрано, приступаем к роутеру.
Регистрируем правило для главной, при этом передаем ядро в контроллер, чтобы иметь доступ к раннее зарегистрированным свойствам и методам.
$codx->get('/', function() use($codx){
$controller = new IndexController($codx);
$controller->indexAction();
});
Если необходимо передать параметры из строки запроса, делаем это следующим образом:
$codx->get('/user/(?P<id>[0-9])', function($params) use($codx){
$controller = new UserController($codx);
$controller->Profile($params['id']);
});
Если необходимо обработать POST, PUT, DELETE запросы, соответственно вместо метода get, пишем интересующий запрос. К примеру:
$codx->post('/news/add', function() use($codx){
$controller = new NewsController($codx);
$controller->add();
});
$codx->delete('/news/(?P<id>[0-9])', function($params) use($codx){
$controller = new NewsController($codx);
$controller->delete($params['id']);
});
После описания роутов запускаем собранное приложение:
$codx->run();
Простой пример приложения 'Привет мир!'
$codx = new CodX();
$codx->get('/', function(){
echo 'Привет мир!';
});
$codx->run();
Адрес проекта https://github.com/mustafa007/CodX