Yii的redirect()方法无法终止执行代码
** 坑爹的redirect() **:在controller里的redirect方法在跳转后,无法终止后续代码的执行。特别在init方法中更棘手。
遇到的情况/问题
在写权限控制的时候,在BaseController里的init方法设置了权限检测,如果权限不足则跳转并且终止执行后续代码,可是问题来了,使用了redirect()方法后,确实是跳转了,但是后续操作依然可以执行,显然没有做到控制权限的效果。
问题分析
查看redirect源码后,发现redirect()方法只是做了一些头的设置和跳转,并不会终止后续代码的执行,通过在init方法里加return
、return false
、 return true
等方法后,依然无效。难道要用header('Location: ' . $redirect_url);exit;
来解决问题?测试后,使用该方法确实可以解决问题,但是这样写会不会有点恶心啊,于是乎发现Yii有提供Yii:$app->response->send();
和Yii:$app->end();
可以做到同样效果,最后就在init里使用了Yii::$app->end();
来解决了这个问题。
再次遇到问题
经过检验,在普通的actionName()方法里,可以使用return 来终止后续代码的执行,但是在init里却不管用,什么情况?有待研究(因为init()只是执行了并没有return?)
解决方案
- 在普通的actionName方法里,可以使用
return
、Yii:$app->response->send();
、Yii:$app->end();
来解决问题,建议使用return
更简洁 - 在init方法里,只能使用
Yii:$app->response->send();
和Yii:$app->end();
来解决问题了。
如有什么错误,欢迎指定和讨论