TP5源码分析-【路由3 - 别名路由a】

一、配置使用
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里面的内容吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值