一、配置使用
Route::alias('user','Index/index');
http://www.test.com/user
二、分析
//$domain = think\route\Domain
$result = $domain->check($this->request, $url, $completeMatch);
到 这个类 think\route\Domain 里面是瞧瞧check
public function check($request, $url, $completeMatch = false)
{
// 检测别名路由
$result = $this->checkRouteAlias($request, $url);
if (false !== $result) {
return $result;
}
// 检测URL绑定
$result = $this->checkUrlBind($request, $url);
if (!empty($this->option['append'])) {
$request->setRouteVars($this->option['append']);
unset($this->option['append']);
}
if (false !== $result) {
return $result;
}
// 添加域名中间件
if (!empty($this->option['middleware'])) {
Container::get('middleware')->import($this->option['middleware']);
unset($this->option['middleware']);
}
return parent::check($request, $url, $completeMatch);
}
第一个检测的就是路由别名 checkRouteAlias
private function checkRouteAlias($request, $url)
{
// var_dump($url); index|index|4
$alias = strpos($url, '|') ? strstr($url, '|', true) : $url;
// var_dump($alias); index
// var_dump($this->router);think\Route
$item = $this->router->getAlias($alias);
// var_dump($item);
return $item ? $item->check($request, $url) : false;
}
以上这个地方又回到了 $this->router 在这里面去取出 getAlias 别名路由对象
如果设置了别名那么会返回 object(think\route\AliasRule)
public function getAlias($name = null)
{
if (is_null($name)) {
return $this->alias;
}
return isset($this->alias[$name]) ? $this->alias[$name] : null;
}
注意: 上面的getAlias 我一度蒙蔽了 既然有getAlias 那么在哪里setAlias的了?? 我就苦苦的找啊 找到路由初始化的时候发现,既然include路由文件了,而且你看Route::alias(‘user’,‘Index/index’); 这不就是set的过程嘛
请看下面的过程:
public function alias($rule, $route, array $option = [])
{
$aliasRule = new AliasRule($this, $this->group, $rule, $route, $option);
$this->alias[$rule] = $aliasRule;
return $aliasRule;
}
那么现在我就直接到think\route\AliasRule 里面去看看check呗
//think\route\AliasRule
public function check($request, $url, $completeMatch = false)
{
if ($dispatch = $this->checkCrossDomain($request)) {
// 允许跨域
return $dispatch;
}
// 检查参数有效性
if (!$this->checkOption($this->option, $request)) {
return false;
}
list($action, $bind) = array_pad(explode('|', $url, 2), 2, '');
if (isset($this->option['allow']) && !in_array($action, $this->option['allow'])) {
// 允许操作
return false;
} elseif (isset($this->option['except']) && in_array($action, $this->option['except'])) {
// 排除操作
return false;
}
if (isset($this->option['method'][$action])) {
$this->option['method'] = $this->option['method'][$action];
}
// 匹配后执行的行为
$this->afterMatchGroup($request);
if ($this->parent) {
// 合并分组参数
$this->mergeGroupOptions();
}
if (isset($this->option['ext'])) {
// 路由ext参数 优先于系统配置的URL伪静态后缀参数
$bind = preg_replace('/\.(' . $request->ext() . ')$/i', '', $bind);
}
$this->parseBindAppendParam($this->route);
if (0 === strpos($this->route, '\\')) {
// 路由到类
return $this->bindToClass($request, $bind, substr($this->route, 1));
} elseif (0 === strpos($this->route, '@')) {
// 路由到控制器类
return $this->bindToController($request, $bind, substr($this->route, 1));
} else {
// 路由到模块/控制器
return $this->bindToModule($request, $bind, $this->route);
}
}
这个check里面的内容就是别名路由的检测内容里面
三、展望
下一节专门讨论一下check里面的内容吧