2010-11-04 56 views
0

我真的很喜欢symfony如何处理路由(内部URI和外部URLS,尤其是“反向查找”一侧)。我一直在尝试将一个类似(独立)的路由作为练习(将来可能会用到)。然而,在尝试了几个小时之后,我就不在那里了。 :(在非Symfony应用程序中使用Symfony路由

我可以看到symfony使用一个标记来解析URI的我在尝试不同的方法(下面的代码)

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 ''; 
    } 

凡$ routes阵列如下:。

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发送的“额外”参数会发生什么情况?

我希望一些symfony大师能够赐教! :p

回答