1

在 yii 中建立一个站点,其中有 3 类用户。在 UserIdentity::authenticate() 中,我设置了这样的用户类型。$this->setState('role', $user->role->id);根据这种类型,我想重定向到属于这种类型用户的模块。更加具体; 如果 Yii::app()->user->role == 3 我想重定向到名为“tradesman”的模块的默认页面。这是我在 SiteController::actionLogin() 中得到的:

/**
 * Displays the login page
 */
public function actionLogin()
{
    $model=new LoginForm;
    // if it is ajax validation request
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }

    // collect user input data
    if(isset($_POST['LoginForm']))
    {
        $model->attributes=$_POST['LoginForm'];
        // validate user input and redirect to the previous page if valid
        if($model->validate() && $model->login()){
            switch(Yii::app()->user->role){
                case 3:
                    $this->redirect(Yii::app()->controller->module->tradesman);
                    break;
                default:
                    $this->redirect(Yii::app()->user->returnUrl);
            }
        }
    }
    // display the login form
    $this->render('login',array('model'=>$model));
}

重定向到模块的方式不起作用。我收到了 Php 通知“试图获取非对象的属性”。然后,我在 TradesmanModule 中创建了一个方法 'defaultUrl,它返回Yii::app()->createUrl($this->getId() . '/default/index');. 我试图重定向到Yii::app()->controller->module->defaultUrl,但结果是一样的。

我也尝试过$this->redirect('tradesman/default/index');$this->redirect('application.modules.tradesman');但随后出现 404 错误,提示“系统无法找到请求的操作“商人”。”。

如果我以角色 3 的用户身份登录,并导航到模块的默认 url,它确实可以工作。但是我该如何重定向?

4

2 回答 2

2

尝试$this->redirect('/tradesman/default/index')并确保 in 模块存在DefaultController并且它的动作actionIndex

更新:
@Николай Конев 是正确的,它只是重定向到 url /tradesman/default/index,而不是路由。对于路由重定向:

$this->redirect( array('/tradesman/default/index') )

tradesman这是模块、控制器default和动作的绝对路径index。如果您想重定向到同一模块中的控制器,您可以使用以下代码:

$this->redirect( array('default/index') )

如果你想重定向到你需要使用的主应用程序控制器:

$this->redirect( array('/default/index') ) // with "/" at the beginning

再次感谢@Николай Конев

于 2013-10-31T15:04:48.053 回答
1

为确保路由正常工作,您必须将数组传递给CController::redirect()

    // for example
    $this->redirect(['/route/starts/from/slash']);
    // your case
    $this->redirect(['/tradesman/default/index']);

在其他情况下,您将在 url 规则更改时破坏重定向。

于 2013-11-01T07:32:59.633 回答