Использование маршрутизации Symfony в не-Symfony приложении - PullRequest
0 голосов
/ 04 ноября 2010

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

Я вижу, что Symfony использует токенайзер для анализа 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 '';
    }

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

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?

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

1 Ответ

2 голосов
/ 05 ноября 2010

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

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

...