Yii2 - 根据用户类型向控制器发送请求

时间:2017-02-23 12:26:28

标签: php yii2 acl

我有一个控制器为admin,另一个为guest。 我希望对http这样的静态地址发出一些test.com/guest/index个请求,并得到以下结果:

如果用户(在请求正文中确定为username)是admin(实际not-guest)用户,那么它应该移植请求(不是重定向,因为重定向不能完成在api-client中,当然http请求不能沿着重定向的方法移动到admin控制器的特定方法。

就像我向POST发送test.com/guest/index请求而我admin所以它应该运行methodName() - 我应该指定名称而不是请求 - 来自{{ 1}}控制器,如果不是admin的其他人发送相同的请求,它应该从admin控制器运行methodName()(相同的方法名称)。

怎么办呢?我用的是Yii2。所以我想知道有没有办法做到这一点,或者如果没有办法可以在一个控制器中使用不同的方法名称? ACL扩展是否可能? 感谢

1 个答案:

答案 0 :(得分:1)

我建议创建名为GuestController的单个控制器,而不是基于发送的信息处理请求,而是基于当前用户状态:

class GuestController extends yii\web\Controller {
    public function actionIndex() {
        $response = null;

        $model = User::getByCredentials();

        if (!$model) {
            $response = $this->guestAction();
        } else {

          switch ($model->role) {
            case 'admin':
               $response = $this->adminAction();
               break;
            case 'user':
               $response = $this->someUserAction();
               break;
          }
       }

        echo $response;
    }

    protected function adminAction() {
        $data = \Yii::$app->request->post(); // still can access _POST/_GET...

        return 'Hallo Warold!';
    }

    /* ... */
}
/**
 *
 */
class User extends yii\web\ActiveRecord {
    public funcion getByCredentials($username, $password) {
        $model = self::findOne(['username' => $username]);

        if (!empty($model) && \Yii::$app->security->validatePassword($password, $model->password)) {
            return $model;
        }

        return null;
    }
}