之前开发项目的时候,咱们习惯于把网站网址作一个配置参数保存,善于用yii2的Url各类方法,无形中让你的代码更简单、更灵活、更规范。
下面就一一说明一下。php
base函数返回当前请求的基地址,它有一个参数$scheme,默认为false,表明返回地址不包含主机信息。
$scheme参数说明git
false 返回地址不包含主机信息github
true 包含主机地址web
http 返回http协议的主机地址yii2
https 返回https协议的主机地址session
'' 返回相对的主机地址yii
咱们以http://yii2-study.local.com/i... 来举例函数
Url::base(); // 返回为'' Url::base(true) // 返回为http://yii2-study.local.com // 记住:最后没有反斜杠哦 Url::base('http'); // 返回为http://yii2-study.local.com Url::base('https'); // 返回为https://yii2-study.local.com Url::base(''); // 返回为//yii2-study.local.com
切记:http https ''这些参数,函数base并无去判断,只是简单的字符串替换,若是你输入了base('d'),则返回网站
d://yii2-study.local.comurl
返回当前请求的标准url
咱们仍是以http://yii2-study.local.com/i... 来举例
echo Url::canonical(); // 返回结果为 http://yii2-study.local.com/index.php?r=site/index
返回当前请求+GET参数,重点是该函数配合参数还能增长删除GET参数,这在咱们某些url匹配时候会变得很是有用。
咱们以http://yii2-study.local.com/i... 来举例
echo Url::current();
执行上述代码后咱们会获得 /index.php?r=site/index&id=78&cat=me 这样的结果
请注意,current()和canonical()区别,若是对本例里的url执行canonical()函数,会获得http://yii2-study.local.com/i... ,相比较current,它多了主机信息,少了GET参数(路由请求除外)。
上面是current获取当前的Url,咱们还可使用current对请求进行修改和删除等操做。
例子1:咱们对当前请求增长一个name=abei GET参数,只须要执行
echo Url::current(['name'=>'abei']);
因而咱们得到了预想的结果/index.php?r=site/index&id=78&cat=me&name=abei
例子2:咱们要删除例子url中的cat参数,只须要执行
echo Url::current(['cat'=>null]);
则结果为/index.php?r=site/index&id=78 哈哈,cat参数被删除了
千万记住:删除一个GET参数的时候,只能设置current对应参数值为null,设置成false或''都是没用的。
例子3:更新例子中url的cat参数为you
echo Url::current(['cat'=>'you']);
是的,yii2很贴心的将将结果返回为 /index.php?r=site/index&id=78&cat=you。感谢薛强,虽然如今在yii2的github已经看不到你的comment,仍然要感谢你创造了yii2.
一个大问题,current返回的结果中如何包含主机信息那?
你只需,只需将current的第二个参数设置为true就ok了。
生成一个URL,to()和toRoute()只有一个不一样,那就是当to()的第一个函数为一个字符串的时候,会直接返回,而toRoute会将其解析成controller/action或action,而后返回url。
下面咱们来举几个例子来讲明下
Url::to(['site/about','cat'=>'abei']); Url::toRoute(['site/about','cat'=>'abei']); // 以上两个函数输出了同一个结果 index.php?r=site/about&cat=abei Url::to('site/index'); Url::toRoute('site/index'); // 以上两个函数输出结果不一样 to()的结果为site/index toRoute()的结果为index.php?r=site/index Url::to(); Url::toRoute(); // to()无参数时返回了当前的路由+GET,而toRoute报错了(toRoute第一个参数不容许不存在) Url::to("@web/images/logo.gif"); Url::toRoute("@web/images/logo.gif"); // to和toRoute均支持别名。 Url::to(['site/index','#'=>'name'); Url::toRoute(['site/index','#'=>'name') // 这里有一个特殊的#,使用他能实现内部锚点,to和toRoute都可以生成index.php?r=site/index#name
固然,to和toRoute也有第二个参数,决定返回的url是否含有主机信息。
你是否有过这样的需求,好比记录一个会员最近30个访问的路径,使用previous和remember就能轻易实现,就和他们的名字同样,用remember能够存储当前路径,使用previous能够把remember存起来的url展现出来。
来来来,贴代码,其余都没有用。
Url::remember('http://www.a.com','a'); Url::remember('http://www.b.com','b'); var_dump(Url::previous('a')); // 结果输出了http://www.a.com
yii2记住了,小提示,是session原理。
我想细心的你必定发现了,是的,previous和remember的参数是能够为空的,没错,阿北用代码来讲明。
咱们仍是以 http://yii2-study.local.com/i...为例
echo Url::previous(); // 当previous参数为空时,返回returnUrl。 echo Url::remember(); // 对于remember函数,当第一个参数$url不提供,将记住当前路由请求(即http://yii2-study.local.com/index.php?r=site/index),第二个参数$name不提供,则默认为yii\web\User::$returnUrlParam
固然Url还有一些其余函数,好比home()等,比较简单,就不一一说明,主要上面几个大方法掌握了,Url基本就过了。