PHP / Laravel消失的变量

时间:2017-06-11 09:42:07

标签: php laravel

我正在处理的应用中有一些非常奇怪的行为。在下面的示例中,有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:未定义索引:用户名

0 个答案:

没有答案