我有一个动作要根据系统从std::string
获取的ID进行“自动登录”。在我的业务服务器中,始终为经过身份验证的用户设置 的值。现在,我正在尝试测试我的自动登录(以及许多其他依赖自动登录的工作),因此我需要将一些用户设置为该全局用户(只是一个字符串)。
我尝试过的事情
$_SERVER['AUTH_USER']
但是,加载自动登录操作后,该值不再位于$ _SERVER全局变量中,并且我的测试崩溃。
我想知道的事情
我可以在哪里或如何设置该全局值,以便页面可以正常工作,读取该值并继续操作。
我将不胜感激。 谢谢。
答案 0 :(得分:2)
似乎缺乏适当的抽象。您应该避免直接在您的应用中访问$_SERVER['AUTH_USER']
,并且最多只能在一个位置进行操作-在将为此提供抽象的组件中。因此,您应该扩展yii\web\Request
并为$_SERVER['AUTH_USER']
抽象添加相关方法:
class MyRequest extends \yii\web\Request {
private $_myAuthUser;
public function getMyAuthUser() {
if ($this->_myAuthUser === null) {
$this->_myAuthUser = $_SERVER['AUTH_USER'];
}
return $this->_myAuthUser;
}
public function setMyAuthUser($value) {
$this->_myAuthUser = $value;
}
}
在配置中使用新类:
return [
'id' => 'app-web',
// ...
'components' => [
'request' => [
'class' => MyRequest::class,
],
// ...
],
];
并在操作中使用抽象:
$authUser = explode('\\', Yii::$app->request->getMyAuthUser())[0];
在测试中,您可以使用MyRequest
中的setter来设置值:
Yii::$app->request->setMyAuthUser('domain\x12345');
或在配置级别进行配置:
return [
'id' => 'app-test',
// ...
'components' => [
'request' => [
'class' => MyRequest::class,
'myAuthUser' => 'domain\x12345',
],
// ...
],
];
更新:
根据 slinstj 注释,Codeception可能会失去request
组件的状态,包括myAuthUser
值。在这种情况下,最好在不同的组件(例如getMyAuthUser()
)上实现setMyAuthUser()
和Yii::$app->user
或为此创建单独的组件:
return [
'id' => 'app-web',
// ...
'components' => [
'authRequest' => [
'class' => MyRequest::class,
],
// ...
],
];
答案 1 :(得分:0)
目前,我正在使用一种变通方法,因为只有一个地方可以检查该变量值:
//Inside my action autologin:
$authUser = explode('\\', ($_SERVER['AUTH_USER'] ?? (YII_ENV_TEST ? 'domain\x12345' : 'domain\xInvalid')))[1];
此处唯一相关的点是YII_ENV_TEST
,即测试时的true
。我可以使用它设置一个足以满足该简单测试要求的特定值。
不过,我希望在这里看到其他更好的主意! 谢谢。