生成URL


虚拟URL路径

在beaconPHP中,我们引入了虚拟URL路径的概念,用过 .net MVC 开发过的同学可能有所了解。

例如:

当前模块路径(我们称为虚拟相对路径):
以 ~ 开头:

~/mybook/show?id=3

mybook 为  当前模块的控制器名 ctl
show为  当前模块的操作名  act
参数 id 为 3


跨模块路径 (我们称为虚拟绝对路径)
以 ^ 开头:

^/admin/member/edit?id=3

其中
admin 为 应用模块名称
member 为 控制器 ctl
edit  为  act
参数 id 为 3

虚拟URL 路径可以方便我们在后期调整真实项目 base基础路径,以及后期美化URL 是可以不用重新改写项目中的url地址。

注意:虚拟路径需要转换成真实路径才是最终的路径,在css js 等资源中使用虚拟路径是错误的。只能在 php 代码和模板中使用。
js css 等资源使用路径需要使用生成后的真实路径。


比如 我们在 项目开发前 后台真实路径是 

/admin/mybook/show?id=1

上线后 我们使用了 域名  mmc.xxx.com 来做后台管理的域名。

即使用 mmc.xxx.com 后,我们的url 地址应该变成

/mybook/show?id=1

那么我们在入口判断域名 如果域名是 mmc.xxx.com 的时候,则路由规则 base 路径改为 '/'

$host=\beacon\core\Request::host();
//如果域名是 mmc.xxx.com 把admin的基础路径 设置未 '/' ,否则 设置 home 的基础路径为 '/'
if($host=='mmc.xxx.com'){
    App::route('admin', '/');
}else{
    App::route('home', '/');
}
App::route('service', '/service');
#运行应用
App::run();


包括可能后期会自定义路由来美化URL,所以我们提供了一个虚拟URL 的实现。
在项目开发和模板使用虚拟URL 来进行开发。


生成URL 真实路径:

URL 的路径生成,是一个对路由的反向解析过程,也是一个从虚拟URL 转换到真实URL路径的过程。

一般在控制器或者其他代码中 我们可以使用 App::url() 来生成真实url地址
代码如下:


class Index extends Controller
{
    /**
     * /index
     * 直接输出字符串
     * @return string
     */
    #[Method(act: 'index', method: Method::GET)]
    public function index(int $id = 0)
    {
        #相对路径
        echo '相对路径' . '<br/>';
        echo App::url('~/index?id=3') . '<br/>';
        echo App::url('~/article/detail?id=3') . '<br/>';
        echo App::url('~/article/detail', ['id' => 3]) . '<br/>';

        echo App::url(['ctl' => 'article', 'act' => 'detail', 'id' => 3]) . '<br/>';
        #当前控制器下的 index 操作
        echo App::url(['act' => 'show', 'id' => 3]) . '<br/>';

        echo '绝对路径' . '<br/>';
        echo App::url('^/admin') . '<br/>';
        echo App::url('^/admin/login?name=abc&pwd=134') . '<br/>';
        echo App::url('^/admin/member/add', ['name' => 'wj008']) . '<br/>';
        echo App::url(['app' => 'admin', 'ctl' => 'member', 'act' => 'show', 'id' => 3]) . '<br/>';
    }

    #[Method(act: 'show', method: Method::GET)]
    public function show(int $id = 0)
    {
        return 'show' . $id;
    }


}



输出的代码如下:

相对路径
/index?id=3
/article/detail?id=3
/article/detail?id=3
/article/detail?id=3
/index/show?id=3
绝对路径
/admin/
/admin/login?name=abc&pwd=134
/admin/member/add?name=wj008
/admin/member/show?id=3



在模板中使用:

class Index extends Controller
{
    /**
     * 使用模板
     * @return string
     */
    #[Method(act: 'index', method: Method::GET)]
    public function index()
    {
        $this->display('index.tpl');
    }

}

视图 
需要在 应用模块 StartUp.php 中配置 模板路径。
/app/home/view/index.tpl

<html>
<body>
相对路径</br>
{url path='~/index' id=3}</br>
{url path='~/article/detail' id=3}</br>
{url act='detail' id=3}</br>
{url ctl='article' act='detail' id=3}</br>
</br>
有与url生成插件字段冲突的写法:</br>
{url act='detail' args=['path'=>'abc','act'=>'msdsd']}</br>
</br>
绝对路径</br>
{url path='^/admin'}</br>
{url path='^/admin/login' name='abc' pwd='123'}</br>
{url app='admin' ctl='member' act='add' name='wj008'}</br>
{url app='service' ctl='upload' act='index'}</br>
</body>
</html>


输出为:

相对路径
/index?id=3
/article/detail?id=3
/index/detail?id=3
/article/detail?id=3

有与url生成插件字段冲突的写法:
/index/detail?path=abc&act=msdsd

绝对路径
/admin/
/admin/login?name=abc&pwd=123
/admin/member/add?name=wj008
/service/upload



提示: 虚拟路径转换成真实路径,是使用 cache 路径模板的方式实现的(在/runtime 目录中可以找到 route.xxx.cache.php),第一次转换会生成对应的url模板,第2次以后会直接使用URL模板链接替换参数,转换代价低,大可不必担心性能问题。



上一篇:自定义路由
下一篇:Request 类
Copyright © 2021 海南的叶子 All Rights Reserved 琼ICP备2021000725号

琼公网安备 46900702000037号