[英]Using Symfony routing in a non-Symfony application
我真的很喜歡symfony如何處理路由(內部URI和外部URL,尤其是“反向查找”方面)。 我一直在嘗試實現類似(獨立)路由作為練習(並可能在將來使用)。 然而,經過幾個小時的努力,我無處可去。 :(
我可以看到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
不要重新發明輪子。 如果它已經寫好並且它很好 - 使用它! Symfony是一個開源項目。 看代碼;)
Symfony 1.4遠比1.0更加分離。 事實上,你可以使用沒有symfony的路由。 查看此博客文章: http : //pookey.co.uk/wordpress/archives/80-playing-with-symfony-routing-without-symfony
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.