CUrlRule
Package | system.web |
---|---|
Inheritance | class CUrlRule » CBaseUrlRule » CComponent |
Since | 1.0 |
Source Code | framework/web/CUrlManager.php |
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
Property | Type | Description | Defined 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
Method | Description | Defined 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
Method | Description | Defined 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 |
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 |
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 |
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 |
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
if($this->verb!==null && !in_array($request->getRequestType(), $this->verb, true))
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.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CUrlRule