Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- Роутер ссылок
- */
- /*
- VRouter::SetAddress('/group/veydlin');
- VRouter::AddModuleGroup('groups');
- VRouter::AddRouter(['groups', 'уникальное имя роутера'], '/group/$name', [
- 'name' => '([a-z_]+)'
- ]);
- VRouter::FindRouter();
- */
- class VRouter {
- public static $routers = []; // Массив роутеров: адрес, функция
- private static $address = null;
- // Создать группу роутеров для модуля (обязательно, даже если роутер один)
- public function AddModuleGroup($name) {
- self::$routers[$name] = [];
- }
- // Добавить обрабодчик роутера
- // $arrInfo: ['имя группы', 'уникальное имя роутера']
- public function AddRouter($arrInfo, $router, $varsRegex) { // ~~~ Проверку входных данных?
- list($moduleName, $routerId) = $arrInfo;
- // Существует ли группа роутеров
- if(!key_exists($moduleName, self::$routers)){
- return VEngine::Error('Группа роутеров "$module" не существует', ['module' => $moduleName]);
- }
- // Экранируем символы в адресе
- $router = str_replace(['/', '?'], ['\/', '\?'], $router); // ~~~ Слишком грубо
- // Заменяем все переменные на их регулярные выражения
- $routerRegex = preg_replace_callback('/(?:\$([a-zA-Z0-9]+))/i', function ($match) use($varsRegex) { // ~~~ регулярку можно и по лучше
- $varName = $match[1];
- if(isset($varsRegex[$varName])){
- return $varsRegex[$varName];
- } else {
- VEngine::Error('В роутере "$router" не существует $varName', ['router' => $router, 'varName' => $varName]);
- }
- }, $router);
- self::$routers[$moduleName][$routerId] = $routerRegex;
- return $routerRegex;
- }
- // Указать тукущий адрес для разбора
- public function SetAddress($newAddress){
- self::$address = $newAddress;
- }
- // Узнать, если ли конфликты в роутерах (дублирование),
- // в противном случае класс просто выполнит первый попавшийся роутер
- public function GetConflicts() {
- $conflicts = [];
- foreach(self::$routers as $router) {
- if(preg_match('/'.$router[0].'/i', self::$address)) {
- $conflicts[] = $router[0];
- }
- }
- return count($conflicts) <= 1 ? false : $conflicts;
- }
- // Вернуть подходящий роутер
- public function FindRouter() {
- foreach(self::$routers as $moduleName => $arrGroups) {
- foreach($arrGroups as $routerId => $routerRegex) {
- if(preg_match('/^'.$routerRegex.'/i', self::$address, $matchs)) { // ~~~ (?:|\/)
- unset($matchs[0]);sort($matchs); // ~~~ Удалять первое через регулярное выражение
- return [
- 'module' => $moduleName,
- 'id' => $routerId,
- 'matchs' => $matchs
- ];
- }
- }
- }
- return false;
- }
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement