我有一个控制器为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扩展是否可能? 感谢
答案 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;
}
}