0 follower

CUrlRule

Package system.web
Inheritance class CUrlRule » CBaseUrlRule » CComponent
Since 1.0
Source Code framework/web/CUrlManager.php
CUrlRule represents a URL formatting/parsing rule.

It mainly consists of two parts: route and pattern. The former classifies the rule so that it only applies to specific controller-action route. The latter performs the actual formatting and parsing role. The pattern may have a set of named parameters.

Public Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
append boolean whether the URL allows additional parameters at the end of the path info. CUrlRule
caseSensitive boolean whether the rule is case sensitive. CUrlRule
defaultParams array the default GET parameters (name=>value) that this rule provides. CUrlRule
hasHostInfo boolean whether host info should be considered for this rule CUrlRule
matchValue boolean whether the GET parameter values should match the corresponding sub-patterns in the rule when creating a URL. CUrlRule
params array list of parameters (name=>regular expression) CUrlRule
parsingOnly boolean whether this rule is only used for request parsing. CUrlRule
pattern string regular expression used to parse a URL CUrlRule
references array the mapping from route param name to token name (e.g. _r1=><1>) CUrlRule
route string the controller/action pair CUrlRule
routePattern string the pattern used to match route CUrlRule
template string template used to construct a URL CUrlRule
urlSuffix string the URL suffix used for this rule. CUrlRule
verb string the HTTP verb (e.g. GET, POST, DELETE) that this rule should match. CUrlRule

Public Methods

Hide inherited methods

MethodDescriptionDefined By
__call() Calls the named method which is not a class method. CComponent
__construct() Constructor. CUrlRule
__get() Returns a property value, an event handler list or a behavior based on its name. CComponent
__isset() Checks if a property value is null. CComponent
__set() Sets value of a component property. CComponent
__unset() Sets a component property to be null. CComponent
asa() Returns the named behavior object. CComponent
attachBehavior() Attaches a behavior to this component. CComponent
attachBehaviors() Attaches a list of behaviors to the component. CComponent
attachEventHandler() Attaches an event handler to an event. CComponent
canGetProperty() Determines whether a property can be read. CComponent
canSetProperty() Determines whether a property can be set. CComponent
createUrl() Creates a URL based on this rule. CUrlRule
detachBehavior() Detaches a behavior from the component. CComponent
detachBehaviors() Detaches all behaviors from the component. CComponent
detachEventHandler() Detaches an existing event handler. CComponent
disableBehavior() Disables an attached behavior. CComponent
disableBehaviors() Disables all behaviors attached to this component. CComponent
enableBehavior() Enables an attached behavior. CComponent
enableBehaviors() Enables all behaviors attached to this component. CComponent
evaluateExpression() Evaluates a PHP expression or callback under the context of this component. CComponent
getEventHandlers() Returns the list of attached event handlers for an event. CComponent
hasEvent() Determines whether an event is defined. CComponent
hasEventHandler() Checks whether the named event has attached handlers. CComponent
hasProperty() Determines whether a property is defined. CComponent
parseUrl() Parses a URL based on this rule. CUrlRule
raiseEvent() Raises an event. CComponent

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
escapeRegexpSpecialChars() Callback for preg_replace_callback in counstructor CUrlRule

Property Details

append property
public boolean $append;

whether the URL allows additional parameters at the end of the path info.

caseSensitive property
public boolean $caseSensitive;

whether the rule is case sensitive. Defaults to null, meaning using the value of CUrlManager::caseSensitive.

defaultParams property
public array $defaultParams;

the default GET parameters (name=>value) that this rule provides. When this rule is used to parse the incoming request, the values declared in this property will be injected into $_GET.

hasHostInfo property
public boolean $hasHostInfo;

whether host info should be considered for this rule

matchValue property (available since v1.1.0)
public boolean $matchValue;

whether the GET parameter values should match the corresponding sub-patterns in the rule when creating a URL. Defaults to null, meaning using the value of CUrlManager::matchValue. When this property is false, it means a rule will be used for creating a URL if its route and parameter names match the given ones. If this property is set true, then the given parameter values must also match the corresponding parameter sub-patterns. Note that setting this property to true will degrade performance.

params property
public array $params;

list of parameters (name=>regular expression)

parsingOnly property (available since v1.1.7)
public boolean $parsingOnly;

whether this rule is only used for request parsing. Defaults to false, meaning the rule is used for both URL parsing and creation.

pattern property
public string $pattern;

regular expression used to parse a URL

references property
public array $references;

the mapping from route param name to token name (e.g. _r1=><1>)

route property
public string $route;

the controller/action pair

routePattern property
public string $routePattern;

the pattern used to match route

template property
public string $template;

template used to construct a URL

urlSuffix property
public string $urlSuffix;

the URL suffix used for this rule. For example, ".html" can be used so that the URL looks like pointing to a static HTML page. Defaults to null, meaning using the value of CUrlManager::urlSuffix.

verb property (available since v1.1.7)
public string $verb;

the HTTP verb (e.g. GET, POST, DELETE) that this rule should match. If this rule can match multiple verbs, please separate them with commas. If this property is not set, the rule can match any verb. Note that this property is only used when parsing a request. It is ignored for URL creation.

Method Details

__construct() method
public void __construct(string $route, string $pattern)
$route string the route of the URL (controller/action)
$pattern string the pattern for matching the URL
Source Code: framework/web/CUrlManager.php#657 (show)
public function __construct($route,$pattern)
{
    if(
is_array($route))
    {
        foreach(array(
'urlSuffix''caseSensitive''defaultParams''matchValue''verb''parsingOnly') as $name)
        {
            if(isset(
$route[$name]))
                
$this->$name=$route[$name];
        }
        if(isset(
$route['pattern']))
            
$pattern=$route['pattern'];
        
$route=$route[0];
    }
    
$this->route=trim($route,'/');

    
$tr2['/']=$tr['/']='\\/';

    if(
strpos($route,'<')!==false && preg_match_all('/<(\w+)>/',$route,$matches2))
    {
        foreach(
$matches2[1] as $name)
            
$this->references[$name]="<$name>";
    }

    
$this->hasHostInfo=!strncasecmp($pattern,'http://',7) || !strncasecmp($pattern,'https://',8);

    if(
$this->verb!==null)
        
$this->verb=preg_split('/[\s,]+/',strtoupper($this->verb),-1,PREG_SPLIT_NO_EMPTY);

    if(
preg_match_all('/<(\w+):?(.*?)?>/',$pattern,$matches))
    {
        
$tokens=array_combine($matches[1],$matches[2]);
        foreach(
$tokens as $name=>$value)
        {
            if(
$value==='')
                
$value='[^\/]+';
            
$tr["<$name>"]="(?P<$name>$value)";
            if(isset(
$this->references[$name]))
                
$tr2["<$name>"]=$tr["<$name>"];
            else
                
$this->params[$name]=$value;
        }
    }
    
$p=rtrim($pattern,'*');
    
$this->append=$p!==$pattern;
    
$p=trim($p,'/');
    
$this->template=preg_replace('/<(\w+):?.*?>/','<$1>',$p);
    
$p=$this->template;
    if(!
$this->parsingOnly)
        
$p=preg_replace_callback('/(?<=^|>)[^<]+(?=<|$)/',array($this,'escapeRegexpSpecialChars'),$p);
    
$this->pattern='/^'.strtr($p,$tr).'\/';
    if(
$this->append)
        
$this->pattern.='/u';
    else
        
$this->pattern.='$/u';

    if(
$this->references!==array())
        
$this->routePattern='/^'.strtr($this->route,$tr2).'$/u';

    if(
YII_DEBUG && @preg_match($this->pattern,'test')===false)
        throw new 
CException(Yii::t('yii','The URL pattern "{pattern}" for route "{route}" is not a valid regular expression.',
            array(
'{route}'=>$route,'{pattern}'=>$pattern)));
}

Constructor.

createUrl() method
public mixed createUrl(CUrlManager $manager, string $route, array $params, string $ampersand)
$manager CUrlManager the manager
$route string the route
$params array list of parameters
$ampersand string the token separating name-value pairs in the URL.
{return} mixed the constructed URL or false on error
Source Code: framework/web/CUrlManager.php#728 (show)
public function createUrl($manager,$route,$params,$ampersand)
{
    if(
$this->parsingOnly)
        return 
false;

    if(
$manager->caseSensitive && $this->caseSensitive===null || $this->caseSensitive)
        
$case='';
    else
        
$case='i';

    
$tr=array();
    if(
$route!==$this->route)
    {
        if(
$this->routePattern!==null && preg_match($this->routePattern.$case,$route,$matches))
        {
            foreach(
$this->references as $key=>$name)
                
$tr[$name]=$matches[$key];
        }
        else
            return 
false;
    }

    foreach(
$this->defaultParams as $key=>$value)
    {
        if(isset(
$params[$key]))
        {
            if(
$params[$key]==$value)
                unset(
$params[$key]);
            else
                return 
false;
        }
    }

    foreach(
$this->params as $key=>$value)
        if(!isset(
$params[$key]))
            return 
false;

    if(
$manager->matchValue && $this->matchValue===null || $this->matchValue)
    {
        foreach(
$this->params as $key=>$value)
        {
            if(!
preg_match('/\A'.$value.'\z/u'.$case,$params[$key]))
                return 
false;
        }
    }

    foreach(
$this->params as $key=>$value)
    {
        
$tr["<$key>"]=urlencode($params[$key]);
        unset(
$params[$key]);
    }

    
$suffix=$this->urlSuffix===null $manager->urlSuffix $this->urlSuffix;

    
$url=strtr($this->template,$tr);

    if(
$this->hasHostInfo)
    {
        
$hostInfo=Yii::app()->getRequest()->getHostInfo();
        if(
stripos($url,$hostInfo)===0)
            
$url=substr($url,strlen($hostInfo));
    }

    if(empty(
$params))
        return 
$url!=='' $url.$suffix $url;

    if(
$this->append)
        
$url.='/'.$manager->createPathInfo($params,'/','/').$suffix;
    else
    {
        if(
$url!=='')
            
$url.=$suffix;
        
$url.='?'.$manager->createPathInfo($params,'=',$ampersand);
    }

    return 
$url;
}

Creates a URL based on this rule.

escapeRegexpSpecialChars() method
protected void escapeRegexpSpecialChars($matches)
$matches
Source Code: framework/web/CUrlManager.php#646 (show)
protected function escapeRegexpSpecialChars($matches)
{
    return 
preg_quote($matches[0]);
}

Callback for preg_replace_callback in counstructor

parseUrl() method
public mixed parseUrl(CUrlManager $manager, CHttpRequest $request, string $pathInfo, string $rawPathInfo)
$manager CUrlManager the URL manager
$request CHttpRequest the request object
$pathInfo string path info part of the URL
$rawPathInfo string path info that contains the potential URL suffix
{return} mixed the route that consists of the controller ID and action ID or false on error
Source Code: framework/web/CUrlManager.php#814 (show)
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
    if(
$this->verb!==null && !in_array($request->getRequestType(), $this->verbtrue))
        return 
false;

    if(
$manager->caseSensitive && $this->caseSensitive===null || $this->caseSensitive)
        
$case='';
    else
        
$case='i';

    if(
$this->urlSuffix!==null)
        
$pathInfo=$manager->removeUrlSuffix($rawPathInfo,$this->urlSuffix);

    
// URL suffix required, but not found in the requested URL
    
if($manager->useStrictParsing && $pathInfo===$rawPathInfo)
    {
        
$urlSuffix=$this->urlSuffix===null $manager->urlSuffix $this->urlSuffix;
        if(
$urlSuffix!='' && $urlSuffix!=='/')
            return 
false;
    }

    if(
$this->hasHostInfo)
        
$pathInfo=strtolower($request->getHostInfo()).rtrim('/'.$pathInfo,'/');

    
$pathInfo.='/';

    if(
preg_match($this->pattern.$case,$pathInfo,$matches))
    {
        foreach(
$this->defaultParams as $name=>$value)
        {
            if(!isset(
$_GET[$name]))
                
$_REQUEST[$name]=$_GET[$name]=$value;
        }
        
$tr=array();
        foreach(
$matches as $key=>$value)
        {
            if(isset(
$this->references[$key]))
                
$tr[$this->references[$key]]=$value;
            elseif(isset(
$this->params[$key]))
                
$_REQUEST[$key]=$_GET[$key]=$value;
        }
        if(
$pathInfo!==$matches[0]) // there're additional GET params
            
$manager->parsePathInfo(ltrim(substr($pathInfo,strlen($matches[0])),'/'));
        if(
$this->routePattern!==null)
            return 
strtr($this->route,$tr);
        else
            return 
$this->route;
    }
    else
        return 
false;
}

Parses a URL based on this rule.