** 坑爹的redirect() **:在controller里的redirect方法在跳转后,无法终止后续代码的执行。特别在init方法中更棘手。

遇到的情况/问题

在写权限控制的时候,在BaseController里的init方法设置了权限检测,如果权限不足则跳转并且终止执行后续代码,可是问题来了,使用了redirect()方法后,确实是跳转了,但是后续操作依然可以执行,显然没有做到控制权限的效果。

问题分析

查看redirect源码后,发现redirect()方法只是做了一些头的设置和跳转,并不会终止后续代码的执行,通过在init方法里加returnreturn falsereturn true等方法后,依然无效。难道要用header('Location: ' . $redirect_url);exit;来解决问题?测试后,使用该方法确实可以解决问题,但是这样写会不会有点恶心啊,于是乎发现Yii有提供Yii:$app->response->send();Yii:$app->end();可以做到同样效果,最后就在init里使用了Yii::$app->end();来解决了这个问题。

再次遇到问题

经过检验,在普通的actionName()方法里,可以使用return 来终止后续代码的执行,但是在init里却不管用,什么情况?有待研究(因为init()只是执行了并没有return?)

解决方案

  • 在普通的actionName方法里,可以使用returnYii:$app->response->send();Yii:$app->end();来解决问题,建议使用return更简洁
  • 在init方法里,只能使用Yii:$app->response->send();Yii:$app->end();来解决问题了。

如有什么错误,欢迎指定和讨论