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

Php Yii2-根据用户类型向控制器发送请求,php,yii2,acl,Php,Yii2,Acl,我有一个控制器作为admin,另一个控制器作为guest。 我希望对静态地址(如test.com/guest/index)进行一些http请求,并得到以下结果: 如果用户(在请求正文中被确定为用户名)是管理员(实际上是不是来宾)用户,那么它应该移植请求(不是重定向,因为重定向不能在api客户机中完成,当然http请求也不能在重定向时沿着方法移动)到admincontroller的特定方法 就像我向test.com/guest/index发送POST请求,我是admin,因此它应该运行method

我有一个控制器作为
admin
,另一个控制器作为
guest
。 我希望对静态地址(如
test.com/guest/index
)进行一些
http
请求,并得到以下结果:

如果用户(在请求正文中被确定为
用户名
)是
管理员
(实际上是
不是来宾
)用户,那么它应该移植请求(不是重定向,因为重定向不能在api客户机中完成,当然http请求也不能在重定向时沿着方法移动)到
admin
controller的特定方法

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

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

我建议创建一个名为
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!';
    }

    /* ... */
}


谢谢,这看起来是一个很好的方法,但是我应该如何设置\Yii::$app->user->role part?因为没有仅基于请求正文和用户名的登录功能,我应该在哪里配置它?如果您不允许用户登录,那么我认为不应该处理管理功能。我可以将任何信息传递到您的表单-username al因此,实际上用户名和密码将随请求一起发送。我应该验证它们,如果是管理员,则执行methodAdmin(),如果不是,则执行methodGuest()。因此,在每个请求中,它都应该自己登录,没有会话、cookie或其他内容。有什么方法可以做到这一点吗?@mohammadfallah.rasoulnejad Check update。您只需在数据库中将
角色
作为用户属性,然后从数据库中按用户名获取用户并比较密码。如果找到并匹配密码,则按规则进行访问,否则作为客人处理。
/**
 *
 */
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;
    }
}