Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Routing/Router.php
Строк: 215
<?php
namespace ConcreteCoreRouting;
use 
SymfonyComponentRoutingGeneratorUrlGenerator;
use 
SymfonyComponentRoutingGeneratorUrlGeneratorInterface;
use 
SymfonyComponentRoutingRequestContext;
use 
SymfonyComponentRoutingRouteCollection as SymfonyRouteCollection;
use 
Request;
use 
Loader;

class 
Router implements RouterInterface
{

    
/**
     * @var UrlGeneratorInterface|null
     */
    
protected $generator;

    
/**
     * @var RequestContext|null
     */
    
protected $context;

    
/**
     * @var SymfonyRouteCollection
     */
    
protected $collection;

    protected 
$request;
    protected 
$themePaths = array();
    public 
$routes = array();

    public function 
__construct() {
        
$this->collection = new SymfonyRouteCollection();
    }

    
/**
     * @return RequestContext
     */
    
public function getContext()
    {
        if (!
$this->context) {
            
$this->context = new RequestContext;
            
$this->context->fromRequest(Request::getInstance());
        }
        return 
$this->context;
    }

    
/**
     * @param RequestContext $context
     */
    
public function setContext(RequestContext $context)
    {
        
$this->context $context;
    }

    
/**
     * @return UrlGeneratorInterface
     */
    
public function getGenerator()
    {
        if (!
$this->generator) {
            
$this->generator = new UrlGenerator($this->getList(), $this->getContext());
        }
        return 
$this->generator;
    }

    
/**
     * @param $generator
     */
    
public function setGenerator(UrlGeneratorInterface $generator)
    {
        
$this->generator $generator;
    }

    public function 
getList() {
        return 
$this->collection;
    }

    public function 
setRequest(Request $req) {
        
$this->request $req;
    }

    
/**
     * Register a symfony route with as little as a path and a callback.
     *
     * @param string $path The full path for the route
     * @param Closure|string $callback `Closure` or "dispatcher" or "NamespaceController::action_method"
     * @param string|null $handle The route handle, if one is not provided the handle is generated from the path "/" => "_"
     * @param array $requirements The Parameter requirements, see Symfony Route constructor
     * @param array $options The route options, see Symfony Route constructor
     * @param string $host The host pattern this route requires, see Symfony Route constructor
     * @param array|string $schemes The schemes or scheme this route requires, see Symfony Route constructor
     * @param array|string $methods The HTTP methods this route requires, see see Symfony Route constructor
     * @param string $condition see Symfony Route constructor
     * @return SymfonyComponentRoutingRoute
     */
    
public function register(
        
$path,
        
$callback,
        
$handle null,
        array 
$requirements = array(),
        array 
$options = array(),
        
$host '',
        
$schemes = array(),
        
$methods = array(),
        
$condition null)
    {
        
// setup up standard concrete5 routing.
        
$trimmed_path trim($path'/');
        if (!
$handle) {
            
$handle preg_replace('/[^A-Za-z0-9_]/''_'$trimmed_path);
            
$handle preg_replace('/_+/''_'$handle);
            
$handle trim($handle'_');
        }
        
$path '/' $trimmed_path '/';

        if (
$callback instanceof Closure) {
            
$attributes ClosureRouteCallback::getRouteAttributes($callback);
        } else if (
$callback == 'dispatcher') {
            
$attributes DispatcherRouteCallback::getRouteAttributes($callback);
        } else {
            
$attributes ControllerRouteCallback::getRouteAttributes($callback);
        }
        
$attributes['path'] = $path;

        
$route = new Route($path$attributes$requirements$options$host$schemes$methods$condition);
        
$this->collection->add($handle$route);

        return 
$route;
    }

    public function 
registerMultiple(array $routes)
    {
        foreach (
$routes as $route => $route_settings) {
            
array_unshift($route_settings$route);
            
call_user_func_array(array($this'register'), $route_settings);
        }
    }

    public function 
execute(Route $route$parameters) {
        
$callback $route->getCallback();
        
$response $callback->execute($this->request$route$parameters);
        return 
$response;
    }

    
/**
     * Used by the theme_paths and site_theme_paths files in config/ to hard coded certain paths to various themes
     * @access public
     * @param $path string
     * @param $theme object, if null site theme is default
     * @return void
    */
    
public function setThemeByRoute($path$theme NULL$wrapper FILENAME_THEMES_VIEW) {
        
$this->themePaths[$path] = array($theme$wrapper);
    }

    public function 
setThemesbyRoutes(array $routes)
    {
        foreach(
$routes as $route => $theme) {
            if (
is_array($theme)) {
                
$this->setThemeByRoute($route$theme[0], $theme[1]);
            } else {
                
$this->setThemeByRoute($route$theme);
            }
        }
    }

    
/**
     * This grabs the theme for a particular path, if one exists in the themePaths array
     * @param string $path
     * @return string|boolean
    */
    
public function getThemeByRoute($path) {
        
// there's probably a more efficient way to do this
        
$txt Loader::helper('text');
        foreach (
$this->themePaths as $lp => $layout) {
            if (
$txt->fnmatch($lp$path)) {
                return 
$layout;
            }
        }
        return 
false;
    }

    public function 
route($data)
    {
        if (
is_array($data)) {
            
$path $data[0];
            
$pkg $data[1];
        } else {
            
$path $data;
        }

        
$path trim($path'/');
        
$pkgHandle null;
        if (
$pkg) {
            if (
is_object($pkg)) {
                
$pkgHandle $pkg->getPackageHandle();
            } else {
                
$pkgHandle $pkg;
            }
        }

        
$route '/ccm';
        if (
$pkgHandle) {
            
$route .= "/{$pkgHandle}";
        } else {
            
$route .= '/system';
        }

        
$route .= "/{$path}";
        return 
$route;
    }

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