我正在处理的应用中有一些非常奇怪的行为。在下面的示例中,有2个功能。
public function updatePhpVhostVersions(Request $r) {
$data = array(
'hostname' => $r['hostname'],
'username' => $r['username'],
'vhost' => $r['vhost'],
'php_version' => $r['php_version']
);
$result = Cpanel::setPhpVhostVersions($data)->data;
if($r->ajax()){
return Response::json($result);
}
return $result;
}
public function getInstalledPhpVersions(Request $r) {
$data = array(
'hostname' => $r['hostname'],
'username' => $r['username']
);
$result = Cpanel::getInstalledPhpVersions($data)->data;
if($r->ajax()){
return Response::json($result);
}
return $result;
}
这两个函数包含Cpanel:: ... ($data)->data;
,它由__call
方法处理。在这个方法中,我使用一个函数来准备一些变量,缓存等,以简化我将一些函数合并为一个的东西。
private function prepare($function, $arguments) {
// Dettirmine what will be used
$this->function = $function;
$nameSplit = preg_split('/(?=\p{Lu})/u', $function);
$this->class = 'App\\Phase\\Cpanel\\' . $this->folder($nameSplit) . '\\' . $this->file($nameSplit);
// Cache True/False
if(isset($this->arguments['cache'])) {
$this->cache = $this->arguments['cache'];
}
// Get the provided arguments
// these are used in the API post
if(isset($arguments[0]['hostname'], $arguments[0]['username'])) {
$arguments = $arguments[0];
}
$this->arguments = $arguments;
// Flush the cache when needed
if (!$this->cache || in_array($nameSplit[0], array('create', 'delete', 'add', 'install', 'set'))) {
try {
Cache::tags(['cpanel', $this->function . $arguments['username']])
->flush();
} catch (Exception $e) {
dd($arguments);
}
}
}
每次使用prepare
方法时都会使用__call
方法。在Cpanel::setPhpVhostVersion()
中,$arguments
在以下if语句之后以某种方式变空。
// Flush the cache when needed
if (!$this->cache || in_array($nameSplit[0], array('create', 'delete', 'add', 'install', 'set'))) {
try {
Cache::tags(['cpanel', $this->function . $arguments['username']])
->flush();
} catch (Exception $e) {
dd($e);
}
}
在Cache::tags()
之前,$arguments
包含一个包含一些用户信息的数组。但是当Cache::tags()->flush()
被调用时,它会抛出$arguments['username']
为空的异常。现在,如果我dd($arguments)
之后,它返回一个空数组。如果我dd()
之前,阵列仍然有信息。这种情况只发生在Cpanel::setPhpVhostVersion()
,而不是其他可能造成这种情况的其他37个Cpanel:: ... ()
?
修改
在玩了一些代码之后,我注意到$arguments
每次使用后都会变空。无论在哪里,它都会变空。 (但只能使用setPhpVhostVersions
)
示例
if(!isset($this->arguments['username'])) {
return Api::respondUnauthenticated('Account username is a required parameter');
}
在!isset()
$arguments['username']
存在之前,在!isset()
期间和之后我获得例外:
ErrorException:未定义索引:用户名