Вход Регистрация
Файл: app/core/classes/UrlMatcher.php
Строк: 54
<?php

class UrlMatcher {

    private 
$methods = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD');
    private 
$routes = array('GET' => array(), 'POST' => array(), 'PUT' => array(), 'DELETE' => array(), 'PATCH' => array(), 'HEAD' => array());
    private 
$patterns = array('num' => '[0-9]+', 'str' => '[a-zA-Z.-_%]+', 'any' => '[a-zA-Z0-9.-_%]+', 'all' => '.+?');

    public function 
addPattern($name, $pattern) {
        
$this->patterns[$name] = $pattern;
    }

    public function 
register($method, $route, $controller) {
        
$methods = strtoupper($method);

        if (
false !== strpos($methods, '|')) {
            
$methods = explode('|', $methods);
        }

        if (
$methods == '*') {
            
$methods = $this->methods;
        }

        
$methods = (array) $methods;

        
$converted = $this->convertRoute($route);

        foreach (
$methods as $m) {
            
$this->routes[$m][$converted] = $controller;
        }
    }

    private function 
convertRoute($route) {
        if (
false === strpos($route, '(')) {
            return 
$route;
        }

        return 
preg_replace_callback('#((w+):(w+))#', array(
            
$this,
            
'replaceRoute'
                
), $route);
    }

    private function 
replaceRoute($match) {
        
$name = $match[1];
        
$pattern = $match[2];

        return 
'(?<' . $name . '>' . strtr($pattern, $this->patterns) . ')';
    }

    
/**
     * @param $method
     * @param $uri
     * @return MatchedRoute
     */
    
public function match($method, $uri) {
        
$method = strtoupper($method);
        
$routes = $this->routes($method);

        if (
array_key_exists($uri, $routes)) {
            return new 
MatchedRoute($routes[$uri]);
        }

        return 
$this->doMatch($method, $uri);
    }

    private function 
routes($method) {
        return isset(
$this->routes[$method]) ? $this->routes[$method] : array();
    }

    private function 
doMatch($method, $uri) {
        foreach (
$this->routes($method) as $route => $controller) {
            if (
false !== strpos($route, '(')) {
                
$pattern = '#^' . $route . '$#s';

                if (
preg_match($pattern, $uri, $parameters)) {
                    return new 
MatchedRoute($controller, $this->processParameters($parameters));
                }
            }
        }
    }

    private function 
processParameters($parameters) {
        foreach (
$parameters as $k => $v) {
            if (
is_int($k)) {
                unset(
$parameters[$k]);
            }
        }

        return 
$parameters;
    }

}
Онлайн: 2
Реклама