1. init方法,初始化UrlManager
// 初始化UrlManager
public function init()
{
parent::init();
if ($this->normalizer !== false) {
$this->normalizer = Yii::createObject($this->normalizer);
if (!$this->normalizer instanceof UrlNormalizer) {
throw new InvalidConfigException('`' . get_class($this) . '::normalizer` should be an instance of `' . UrlNormalizer::className() . '` or its DI compatible configuration.');
}
}
if (!$this->enablePrettyUrl) {
return;
}
if (!empty($this->rules)) {
$this->rules = $this->buildRules($this->rules);
}
}
2. addRules方法,添加额外的URL规则
/**
* 添加额外的URL规则
* @param array $rules 规则
* @param bool $append 是否把新规则追加已有规则的末尾
* @throws InvalidConfigException
*/
public function addRules($rules, $append = true)
{
if (!$this->enablePrettyUrl) {
return;
}
$rules = $this->buildRules($rules);
if ($append) {
$this->rules = array_merge($this->rules, $rules);
} else {
$this->rules = array_merge($rules, $this->rules);
}
}
3. buildRules方法,根据给定的规则声明构建URL规则对象
//根据给定的规则声明构建URL规则对象
protected function buildRules($ruleDeclarations)
{
$builtRules = $this->getBuiltRulesFromCache($ruleDeclarations);
if ($builtRules !== false) {
return $builtRules;
}
$builtRules = [];
$verbs = 'GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS';
foreach ($ruleDeclarations as $key => $rule) {
if (is_string($rule)) {
$rule = ['route' => $rule];
if (preg_match("/^((?:($verbs),)*($verbs))\\s+(.*)$/", $key, $matches)) {
$rule['verb'] = explode(',', $matches[1]);
$key = $matches[4];
}
$rule['pattern'] = $key;
}
if (is_array($rule)) {
$rule = Yii::createObject(array_merge($this->ruleConfig, $rule));
}
if (!$rule instanceof UrlRuleInterface) {
throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
}
$builtRules[] = $rule;
}
$this->setBuiltRulesCache($ruleDeclarations, $builtRules);
return $builtRules;
}
总结:
阅读了3个方法:
- init方法,初始化UrlManager
- addRules方法,添加额外的URL规则
- buildRules方法,根据给定的规则声明构建URL规则对象