URL - 生成网址 ¶
作者:KK
发表日期:2016.12.10
基础输出 ¶
在项目的模板里肯定免不了有很多超级链接,点击这个跳到这里那里,比如我们的test控制器的abc方法是用来显示"个人中心"的,则可能会有这样的HTML代码:
<a href="/?r=test/abc">个人中心</a>
但上面的HTML写死了一个网址,这是绝对不提倡的做法
原因就先不说了,我们输出一个网址的时候必须用PHP代码来输出,一般情况下都通过yii\helpers\Url这个类来输出,比如
<a href="<?php echo Url::to(['test/abc']); ?>">个人中心</a>
(但使用前记得先在模板顶部use yii\helpers\Url
才能使用这个Url类哦)
也许你看得懂了,to方法里的参数必须是一个数组,这是很多初学Yii的开发者会犯的错误,他们直接填了个字符串,变成 Url::to(
'test/abc'
)这是错误的传参方式,其实应该是 Url::to(
['test/abc']
) ,数组里有一个元素,这个元素用controllerID/actionID
的格式描述了要生成哪个控制器哪个方法的网址
附加GET参数输出 ¶
然后我们要输出一个网址表达里面的userId是123,就是 Url::to(['test/abc', 'userId' => 123])
如果看得有点迷糊,我下面拆解一下这个代码:
$urlParams = [
'test/abc', //第一个数组元素,表达了 控制器/方法
'userId' => 123, //第二个参数,表达了要附带的GET参数,key就是get参数的名称,value你懂的
];
echo Url::to($urlParams); //OK?
那么附带更多get参数,依然继续追加数组参数就好了
$urlParams = [
'test/abc', //控制器/方法
'userId' => 123, //第一个参数
'type' => 9, //第二个参数
];
附带域名输出 ¶
现在生成的URL都是相对URL,默认是当前站点的,但是如果你这个URL想生成带有域名的完整URL则是传入第二个参数,值为true即可,比如这样:
$urlParams = [
'test/abc', //控制器/方法
'userId' => 123, //第一个参数
'type' => 9, //第二个参数
];
echo Url::to($urlParams, true);
附加锚点输出 ¶
如果要生成/a/b/c.html#aa
这种带#
(锚点)的URL输出,办法也很简单,就是在第一个数组参数里加多一个叫#
的key就可以
比如Url::to(['site/index', '#' => 'ccc'])
会生成/index.html#ccc
比如Url::to(['site/index', 'a' => 'b', '#' => 'ccc'])
会生成/index.html?a=b#ccc
重定向 ¶
在控制器里重定向则要return $this->redirect($url);
,这个$this是控制器哦
控制器的redirect方法是返回一个Response对象的,再将它返回给底层来处理就好了
如果是非控制器层需要重定向则使用Yii::$app->response->redirect
通过response组件来设定重定向也可以实现
以上方式都仅仅是修改response组件的属性状态,以便在底层处理响应时把这个重定向头发给浏览器
如果你等不及底层处理,要马上执行的话,再执行response组件的send方法即可马上发送重定向头(包含已经设置的所有response内容)给客户端
并且send方法执行后不会停止后面的PHP代码运行哦