2010-11-04 2 views
0

Мне очень нравится, как symfony обрабатывает маршрутизацию (внутренние URI и внешние URL-адреса, особенно стороны «обратного просмотра»). Я пытался реализовать подобную (автономную) маршрутизацию как упражнение (и возможное использование в будущем). Однако, проработав несколько часов, я не знаю, где близко. :(Использование маршрутизации Symfony в приложении, отличном от Symfony

Я могу видеть, что Symfony использует Tokenizer для разбора URIs Я пытаю другой подход (код ниже)

function url_for($page){ 
     if($page[0] == '@'){ 
      preg_match('/@([^\\.?]+)\??(.*)/', $page, $matches); 
      list(, $label, $params_str) = $matches; 
      parse_str($params_str, $params); 
      $package = isset(self::$routes[trim($label)]['params']['package']) ? self::$routes[trim($label)]['params']['package'] : (isset($params['package']) ? $params['package'] : NULL); 
      $module = isset(self::$routes[trim($label)]['params']['module']) ? self::$routes[trim($label)]['params']['module'] : (isset($params['module']) ? $params['module'] : NULL); 
      $action = isset(self::$routes[trim($label)]['params']['action']) ? self::$routes[trim($label)]['params']['action'] : (isset($params['action']) ? $params['action'] : NULL); 
     } else { 
      preg_match('/([^\\.]+)\\\\([^\\.]+)\\\\([^\\.?]+)\??(.*)/', $page, $matches); 
      list(, $package, $module, $action, $params_str) = $matches; 
      parse_str($params_str, $params); 
     } 

     array_shift($matches); 
     array_pop($matches); 

     if($action == NULL) return ''; 

     $found = FALSE; 

     foreach($routes as $route){ 
      preg_match_all('/:([^\\.\/]+)/', $route['pattern'], $possible_keys); 
      $possible_keys = array_merge($route['params'], array_flip($possible_keys[1])); 
      $given_keys = array_merge($route['params'], $params); 
      $intersection = array_intersect_key($possible_keys, $given_keys); 
      if(count($possible_keys) <= count($intersection)){ 
       $found = TRUE; 
       break; 
      } 
     } 

     if($found){ 
      return $route['pattern']; 
     } 

     return ''; 
    } 

Где массив $ маршрутов выглядит следующим образом:..

array(
    'home' => array(
     'pattern' => '/', 
     'params' => array(
      'package' => 'Module', 
      'module' => 'Home', 
      'action' => 'Index' 
     ) 
    ), 
    'user' => array(
     'pattern' => '/user/:action', 
     'params' => array(
      'package' => 'Module', 
      'module' => 'User' 
     ) 
    ), 
    'default' => array(
     'pattern' => '/:module/:action', 
     'params' => array(
      'package' => 'Module' 
     ) 
    ) 
); 

Несколько вещей меня смущают:

1) Как symfony обрабатывает шаблон звездочки («*»)?
2) Как маршрутизатор «определяет» правильный маршрут? Напр. что происходит с «дополнительными» параметрами, отправленными как внутренний URI?

Я надеюсь, что какой-то гуру симфонии может просветить меня! : p

ответ

2

Не изобретайте велосипед. Если он уже написан, и это хорошо - используйте его! Symfony - проект с открытым исходным кодом. Посмотрите на код;)

Symfony 1.4 намного более развязан, чем 1.0. Фактически вы можете использовать маршрутизацию без symfony. Отметьте этот пост в блоге: http://pookey.co.uk/wordpress/archives/80-playing-with-symfony-routing-without-symfony