[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Начала роутинга
Страницы: 1, 2
twin
Сразу с лирического отступления начну.

Я тут начал делать, пока примитивно, но работает уже по дефолту.

Так как это учебно-тренировочный фреймворк, то он должен поддерживать типы маршрутизации топовых фреймворков. А они все кто-куда. Используют и обычные массивы, и 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. Начинаются практические работы. Желающих поучаствовать и прокачать скиллы - милости просим.

Ну и хотелось бы критики на дессерт. :)

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.