Yii2登录后重定向到上一页

Yii2 redirecting to previous page after login

你好世界!

所以这是交易,我试图在登录后将用户重定向到上一页,但它不起作用.. 我尝试使用所有这些:

Yii::$app->request->getReferrer(); // printing the refferrer url to screen 
$this->redirect(\Yii::$app->request->referrer)


 return \Yii::$app->getResponse()->redirect(\Yii::$app->getUser()->getReturnUrl($defaultUrl));
以上

none 有效

 public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
                $this->goHome();
        //    $this->goHome();
        }

        /** @var LoginForm $model */
        $model = \Yii::createObject(LoginForm::className());
        $event = $this->getFormEvent($model);

        $this->performAjaxValidation($model);
       $baseurl = \Yii::$app->request->getAbsoluteUrl();
        $this->trigger(self::EVENT_BEFORE_LOGIN, $event);

        if ($model->load(\Yii::$app->getRequest()->post()) && $model->login()) {
            $this->trigger(self::EVENT_AFTER_LOGIN, $event);
           // return $this->redirect(\Yii::$app->request->referrer);
          //  return \Yii::$app->getResponse()->redirect(\Yii::$app->getUser()->getReturnUrl($defaultUrl));
           // return \Yii::$app->request->getReferrer(); // printing the refferrer url to screen :(!!
           return $this->redirect($baseurl);
         // return $this->redirect(\Yii::$app->request->referrer);; //this one is returning everthing to main page, because of line 147
          //  return $this->goBack();
        }

        return $this->render('login', [
            'model'  => $model,
            'module' => $this->module,
        ]);
    }


在 web.php 配置中我有这个:

$config =[ 
..//
'modules' => [
        'user' => [
            'class' => 'dektrium\user\Module',
            'enableUnconfirmedLogin' => true,
            'confirmWithin' => 21600,
            'cost' => 12,
            'enableFlashMessages' => true,
            'admins' => ['a'],
        ],
    //..

以上所有这些只是在登录主页后发送用户 请问我该怎么办,我已经搜索了所有阅读文档的地方

经过 4 小时的尝试后,我在请求推荐人后尝试 "Echo" URL; 推荐人工作正常问题是登录后页面加载不止一次这是问题为什么它不发送回该页面而是将人们发送到当前页面(登录页面)然后如果他是用户他会自动送回家。

这个问题很常见,它与您 post 登录时的问题有关,您的实际引荐来源网址是登录页面 - actionLogin(),因此您被重新重定向并关闭当然你在整个过程中都通过了 条件是你不是Guest。为了处理这个问题,您必须为模态字段分配一个引荐来源网址,以便它可以 post 与登录信息一起使用。因此,在验证登录时,您的字段中有所需的推荐人 url。检查您的表单中是否标识了此字段:

<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
<?= $form->field($model, 'referer')->hiddenInput()->label(false) ?>

控制器

$form = new LoginForm();
//get previos viewed page url and store in the new model
$form->referer = Yii::$app->request->referrer;
if ($form->load(Yii::$app->request->post())) {
   if($form->login()){
      return $this->goBack((($form->referer) ? $form->referer : null));
   }
}

LoginForm() 模型

public $referer;
/**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            //...
            ['referer', 'string'],
        ];
    }

之后,当它是post请求时,这个字段将包含一个引荐来源网址,您将在您的控制器中传递它。

此外,如果您使用 yii2-user 模块,现在可以并且有必要在 controllerMap 的配置中删除事件的所有强制重定向 "after logging in"(我将它们注释掉):

...
'modules' => [
        'user' => [
            'class' => \dektrium\user\Module::className(),
            'admins' => ['adminname'],
            'enableConfirmation' => false,
            'modelMap' => [
                'User' => 'app\models\User',
                'UserSearch' => 'app\models\UserSearch',
                'Profile' => 'app\models\Profile',
            ],
            'controllerMap' => [
                'profile' => 'app\controllers\user\ProfileController',
                'security' => [
                    'class' => \dektrium\user\controllers\SecurityController::className(),
                    'on ' . \dektrium\user\controllers\SecurityController::EVENT_AFTER_LOGIN => function ($e) {
                        /*if (Yii::$app->user->can('student free')) {
                            Yii::$app->response->redirect(array('/course'))->send();
                        }
                        if (Yii::$app->user->can('admin')) {
                            Yii::$app->response->redirect('http://site.ru/user/')->send();
                        }*/

                        //Yii::$app->response->redirect(Yii::$app->request->referrer)->send();
                    //    Yii::$app->response->redirect(array('/user/'.Yii::$app->user->id))->send();
                        //Yii::$app->end();
                    }
                ],
            ],
        ],
...

我在@serghei Leonenco 的帮助下做到了,
但我遇到了这些问题:

  1. 页面在按下提交按钮后重新加载,因此引荐来源网址始终是登录页面,这就是它不断将用户发送到主页的原因。
  2. 我必须在表格开始之前得到推荐人。
  3. 我必须将引荐来源网址的值传递给隐藏的输入。
  4. 我必须检查引荐来源网址是来自我的网站还是来宾是从第 3 方网站进入登录页面。
  5. 检查后传递了值,使用了重定向和 Url::to('link', true) 因为我从 referrer 得到的值是完整的 URL 而我不能只是重定向完整的 link 这就是为什么我在真实条件下使用 Url::to 的原因,这意味着创建一个新的 URL.

查看

请注意,我在表格前使用了引荐来源网址值。

<div class="panel-body arab">
                **<?php $referer = \Yii::$app->request->referrer;?>**
                <?php $form = ActiveForm::begin([
                    'id' => 'login-form',
                    'enableAjaxValidation' => true,
                    'enableClientValidation' => false,
                    'validateOnBlur' => false,
                    'validateOnType' => false,
                    'validateOnChange' => false,
                ]) ?>
                **<?= $form->field($model, 'referer')->hiddenInput(['value' => $referer])->label(false) ?>**
                <?php if ($module->debug): ?>
                    <?= $form->field($model, 'login', [
                        'inputOptions' => [
                            'autofocus' => 'autofocus',
                            'class' => 'form-control',
                            'tabindex' => '1']])->dropDownList(LoginForm::loginList());
                    ?>

                <?php else: ?>

                    <?= $form->field($model, 'login',
                        ['inputOptions' => ['autofocus' => 'autofocus', 'class' => 'form-control', 'tabindex' => '1']]
                    );
                    ?>

                <?php endif ?>

                <?php if ($module->debug): ?>
                    <div class="alert alert-warning">
                        <?= Yii::t('user', 'Password is not necessary because the module is in DEBUG mode.'); ?>
                    </div>
                <?php else: ?>
                    <?= $form->field(
                        $model,
                        'password',
                        ['inputOptions' => ['class' => 'form-control', 'tabindex' => '2']])
                        ->passwordInput()
                        ->label(
                            Yii::t('user', 'Password')
                            . ($module->enablePasswordRecovery ?
                                ' (' . Html::a(
                                    Yii::t('user', 'Forgot password?'),
                                    ['/user/recovery/request'],
                                    ['tabindex' => '5']
                                )
                                . ')' : '')
                        ) ?>
                <?php endif ?>

                <?= $form->field($model, 'rememberMe')->checkbox(['tabindex' => '3']) ?>

                <?= Html::submitButton(
                    Yii::t('user', 'Sign in'),
                    ['class' => 'btn btn-success btn-block', 'tabindex' => '4']
                ) ?>

                <?php ActiveForm::end(); ?>
                

型号

注意我使用正则表达式来确保用户使用我的网站登录页面。

public function getReferer()
    {
        $getLink = \Yii::$app->request->post('login-form')['referer'];
        if(preg_match('/tajrobtak/', $getLink)){
        return $getLink;
        } else {
        return "";
        }
    }

控制器

 public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            $this->goHome();
        }

        /** @var LoginForm $model */
        $model = \Yii::createObject(LoginForm::className());
        $referery = $model->getReferer();
        $event = $this->getFormEvent($model);

        $this->performAjaxValidation($model);

        $this->trigger(self::EVENT_BEFORE_LOGIN, $event);

        if ($model->load(\Yii::$app->getRequest()->post()) && $model->login()) {
            $this->trigger(self::EVENT_AFTER_LOGIN, $event);
            $this->redirect(Url::to($referery,true));
        }

        return $this->render('login', [
            'model'  => $model,
            'module' => $this->module,
        ]);
    }