Я тут начал делать, пока примитивно, но работает уже по дефолту.
Так как это учебно-тренировочный фреймворк, то он должен поддерживать типы маршрутизации топовых фреймворков. А они все кто-куда. Используют и обычные массивы, и XML и JSON и YAML. С обычными массивами все ясно, а вот на остальные форматы нужен конвертор. За одно будет неплохой компонент на будущее.
Ни кто не хочет присоединиться и помочь? :)
Ну а теперь про роутинг. Введение для тех, кто не в теме.
Route - (англ) маршрут. Соответственно роутинг - маршрутизация. Это определение функционала, который нужно задействовать, в зависимости от полученных от юзера данных и установленных настроек. Настройки, это правила роутинга. Правила, это обычно своеобразные регулярные выражения, по которым роутер разбирает полученный URL и сопоставляет ему нужные контроллеры, экшены и GET-параметры.
Вот допустим самый простой набор правил в виде PHP массива от Yii:
[
'<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>',
'<controller:(post|comment)>/<id:\d+>' => '<controller>/read',
'<controller:(post|comment)>s' => '<controller>/list',
]
Это правила с именнованными параметрами. оно сработает, если к примеру придет такой URL:
http://site.com/comment/15/delete
Роутер разберет его по первому правилу, и получит следующие данные
$controller = 'comment';
$action = 'delete';
$id = 15
Соответственно задействует CommentController, вызовет в нем экшен delete(), и передаст ему ID = 15. Значит комментарий с этим ID будет удален.
По этому же правилу будет работать такой URL
http://site.com/post/10/update
но задействует уже такой функционал:
$controller = 'post';
$action = 'update';
$id = 10
Соответственно будет отредактирован пост с ID = 10.
В общих чертах так.
А теперь ближе к телу. Я пока не сделал разбор правил, подключается только пустой контроллер. Просто чтобы отследить цепочку. Процессор фреймворка запускат роутер:
\Abc\core\AbcPrjwtssor
/**
* Устанавливает пользовательские маршруты и запускает роутер
*
* @return void
*/
public function route()
{
$this->router = new Router;
$this->router->config = $this->config;
$this->router->run();
}
Дальше роутер устанавливает путь до директории с контроллерами по дефолту, или с пользовательскими настройками.
/**
* Возвращает директорию с пользовательскими контроллерами
*
* @return string
*/
public function getControllersDir()
{
$userSettings = @$this->config['settings'] ?: [];
$settings = array_merge($this->defaultSettings, $userSettings);
return $settings['application'] .'\\'. $settings['dir_controllers'];
}
Ну и пытается вызвать контроллер из этой папки (с именем контроллера пока затык):
/**
* Вызывает контроллер
*
* @return void
*/
public function run()
{
$controllersDir = $this->getControllersDir();
$controllerName = $this->getControllerName();
$controller = '\ABC\\'. $controllersDir .'\\'. $controllerName .'Controller';
if (!class_exists($controller)) {
$this->create404($controller);
} else {
(new $controller());
}
}
Если такого нет, вызывается базовый контроллер и запускается экшен 404
/**
* Если не найден контроллер, активирует базовый с генерацией 404 заголовка
*
* @param string $controller
*
* @return string
*/
public function create404($controller)
{
(new BaseController($this->config))->action404($controller);
}
Все контроллеры должны наследоваться от базового, чтобы получить всякие дополнительные плюшки фреймворка.
Ну вот в общих чертах такое начало. Дальше нужно делать парсер правил роутинга и Request. Начинаются практические работы. Желающих поучаствовать и прокачать скиллы - милости просим.
Ну и хотелось бы критики на дессерт. :)
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
