我有继承其他人的主控制器。代码是这样的
public function init()
{
$this->on('beforeAction', function ($event) {
...
if (Yii::$app->getUser()->isGuest) {
$request = Yii::$app->getRequest();
// dont remember login page or ajax-request
if (!($request->getIsAjax() || strpos($request->getUrl(), 'login') !== false)) {
Yii::$app->getUser()->setReturnUrl($request->getUrl());
}
}
}
...
});
}
除了带有验证码的页面外,它适用于所有页面。所有带验证码的页面都被重定向到这样的东西 - / captcha /?v = xxxxxxxxxxxxxx
如果对象被记录Yii :: $ app-> getRequest(),那么我看到对于带有验证码的页面,它会被使用两次。第一次对象是corect,第二次我用captcha看到对象。 如何用yii解决这个问题?有机会不跟踪验证码的请求吗?
答案 0 :(得分:1)
默认(生成)控制器使用如下内容:
public function actions()
{
return [
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
],
];
}
你的控制器是否包含这样的东西?
这意味着有一个动作"验证码"用于显示验证码(它返回图像)。当您有一个显示验证码的页面时,将在您要返回的页面之后调用该图像。因此,访问的最新页面是具有验证码的页面。
我认为你必须过滤掉这个动作。
另一种可能是使用默认的$controller->goBack()
方法。我认为这会默认处理returnUrl
的注册。
答案 1 :(得分:0)
在控制器中使用访问控制过滤器(ACF)。
use yii\web\Controller;
use yii\filters\AccessControl;
class SiteController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['login', 'logout', 'signup'],
'rules' => [
[
'allow' => true,
'actions' => ['login', 'signup'],
'roles' => ['?'],
],
[
'allow' => true,
'actions' => ['logout'],
'roles' => ['@'],
],
],
],
];
}
// ...
}