Advertisement
Guest User

Untitled

a guest
Oct 1st, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.56 KB | None | 0 0
  1. <?php
  2. /*
  3.   Роутер ссылок
  4. */
  5. /*
  6. VRouter::SetAddress('/group/veydlin');
  7. VRouter::AddModuleGroup('groups');
  8. VRouter::AddRouter(['groups', 'уникальное имя роутера'], '/group/$name', [
  9.     'name' => '([a-z_]+)'
  10. ]);
  11. VRouter::FindRouter();
  12. */
  13.  
  14.  
  15.  
  16.  
  17. class VRouter {
  18.     public static $routers = []; // Массив роутеров: адрес, функция
  19.     private static $address = null;
  20.  
  21.  
  22.     // Создать группу роутеров для модуля (обязательно, даже если роутер один)
  23.     public function AddModuleGroup($name) {
  24.         self::$routers[$name] = [];
  25.     }
  26.  
  27.  
  28.  
  29.  
  30.     // Добавить обрабодчик роутера
  31.     // $arrInfo: ['имя группы', 'уникальное имя роутера']
  32.     public function AddRouter($arrInfo, $router, $varsRegex) { // ~~~ Проверку входных данных?
  33.         list($moduleName, $routerId) = $arrInfo;
  34.  
  35.         // Существует ли группа роутеров
  36.         if(!key_exists($moduleName, self::$routers)){
  37.             return VEngine::Error('Группа роутеров "$module" не существует', ['module' => $moduleName]);
  38.         }
  39.  
  40.         // Экранируем символы в адресе
  41.         $router = str_replace(['/', '?'], ['\/', '\?'], $router); // ~~~ Слишком грубо
  42.        
  43.         // Заменяем все переменные на их регулярные выражения
  44.         $routerRegex = preg_replace_callback('/(?:\$([a-zA-Z0-9]+))/i', function ($match) use($varsRegex) { // ~~~ регулярку можно и по лучше
  45.             $varName = $match[1];
  46.             if(isset($varsRegex[$varName])){
  47.                 return $varsRegex[$varName];
  48.             } else {
  49.                VEngine::Error('В роутере "$router" не существует $varName', ['router' => $router, 'varName' => $varName]);
  50.             }
  51.         }, $router);
  52.        
  53.  
  54.         self::$routers[$moduleName][$routerId] = $routerRegex;
  55.  
  56.         return $routerRegex;
  57.     }
  58.  
  59.  
  60.  
  61.  
  62.     // Указать тукущий адрес для разбора
  63.     public function SetAddress($newAddress){
  64.         self::$address = $newAddress;
  65.     }
  66.  
  67.  
  68.  
  69.  
  70.     // Узнать, если ли конфликты в роутерах (дублирование),
  71.     // в противном случае класс просто выполнит первый попавшийся роутер
  72.     public function GetConflicts() {
  73.         $conflicts = [];
  74.  
  75.         foreach(self::$routers as $router) {
  76.             if(preg_match('/'.$router[0].'/i', self::$address)) {
  77.                 $conflicts[] = $router[0];
  78.             }
  79.         }
  80.  
  81.         return count($conflicts) <= 1 ? false : $conflicts;
  82.     }
  83.  
  84.  
  85.  
  86.  
  87.     // Вернуть подходящий роутер
  88.     public function FindRouter() {
  89.         foreach(self::$routers as $moduleName => $arrGroups) {
  90.             foreach($arrGroups as $routerId => $routerRegex) {
  91.                 if(preg_match('/^'.$routerRegex.'/i', self::$address, $matchs)) { // ~~~ (?:|\/)
  92.                     unset($matchs[0]);sort($matchs); // ~~~ Удалять первое через регулярное выражение
  93.                     return [
  94.                         'module' => $moduleName,
  95.                         'id' => $routerId,
  96.                         'matchs' => $matchs
  97.                     ];
  98.                 }    
  99.             }
  100.         }
  101.         return false;
  102.     }
  103.  
  104.    
  105. }
  106.  
  107.  
  108.  
  109. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement