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代码运行哦