Gerçekten symfony (iç ve dış URIs URL'ler, özellikle "geriye doğru arama" tarafı) yönlendirmesini işler nasıl gibi. Ben bir egzersiz (ve gelecekte olası kullanım) benzer bir (bağımsız) yönlendirme uygulamaya çalışıyorlar. Ancak, saatlerce denedikten sonra, ben hayır nereye yakın duyuyorum. (
Ben symfony URI ayrıştırmak için bir dizgeciklerini kullandığını görebilirsiniz. (Aşağıda kodu) farklı bir yaklaşım çalışılıyor.
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 '';
}
Aşağıdaki gibi $ yolları dizidir Nerede:
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'
)
)
);
Bir şeyler beni karıştırmayın:
1) How does symfony handle the asterisk ("*") pattern?
2) How does the router "determine" the correct route? For e.g. what happens to "extra" parameters sent as the internal URI?
Bazı symfony guru beni aydınlatmak umut! : P