2015-01-08 38 views
0

僅供參考我使用的是SLIM架構PHP匿名函數,使用關鍵字和變量的作用域問題

我的問題是,你看到註釋掉下面代碼print_r的命令。出於某種原因,該變量是,它顯示在!in_array函數之前的正確值。我不知道發生了什麼,但是當您將變量$allowedUserTypes傳遞給該函數時,它似乎正在使用(我從某處猜測變量的舊版本)不正確的值。不知道這是如何可能的,因爲它正好在該函數之前工作。我猜測有一些範圍問題,或者我誤解了匿名函數中'USE'關鍵字的使用。

$validate_user = function ($allowedUserTypes, $templateFolder = 'api'){ 
    return function() use ($allowedUserTypes, $templateFolder){ 
     global $app, $settings, $user, $device; 

     set_template_directory($templateFolder); 

     $errors = array(); 

     $validated = true;//assumed valid until proven false. 

     //check session variables only if not token api call 
     if($app->request()->params('token') == ''){ 

      //Check for expiration date hack 
      if($_SESSION['remember']==false){ 
       $now = new DateTime(); 
       $now->modify("-30 minutes"); 
      }else{ 
       $now = new DateTime(); 
       $now->modify("-14 days"); 
      } 

      //If the cookie still exists then it might have a time value in it. See if it's set. 
      if(isset($_SESSION['time'])){ 
       //If time now (minus minute) is greater than the session time then hack attempted. 
       if($now > $_SESSION['time']){ 
        $errors["errors"]["generic"][] = "Permission denied. Cookie expired."; 
        $validated = false; 
        unset($_SESSION['time']); 
        unset($_SESSION['remember']); 
        unset($_SESSION['userid']); 
        unset($user); 
       } 
      } 
     } 

     if(isset($user)){ 
      $usertype = Usertype::find_by_id($user->usertype_id);//get all usertypes 

      //print_r($allowedUserTypes); --> shows Admin, Manager, Franchise Admin, Franchise Manager 
      if(!in_array($usertype->name,$allowedUserTypes)){ 
       //print_r($allowedUserTypes); --> shows only Admin, Manager ?? 

       $errors["errors"]["generic"][] = "Permission denied for user type :".$usertype->name; 
       $validated = false; 
      } 
     }else{ 
      $errors["errors"]["generic"][] = "Permission denied. User not logged in. Please log in and try again."; 
      $validated = false; 
     } 

     if($validated==false){ 
      $errors["command"] = "Error"; 
      $errors['message'] = "User could not be validated."; 

      if($templateFolder=='templates'){ 
       $app->render('shared/header.php',  array('settings' => $settings)); 
       $app->render($device.'/header.php',  array('settings' => $settings, 'pagetitle' => 'Pool Service USA | Error Page', 'user' => $user)); 
       $app->render($device.'/error.php',  array('settings' => $settings, 'errors' => $errors,'device' => $device)); 
       $app->render($device.'/footer.php',  array('settings' => $settings)); 
       $app->render('shared/footer.php',  array('settings' => $settings)); 
      }else{ //API Based Errors 
       $app->render('shared/error.php', array(
        'settings' => $settings, 
        'errors' => $errors, 
        'device' => $device 
       )); 
      } 

      $app->stop();//stop rendering to this point. 
     } 
    }; 
}; 

我會在我打電話給它之前,以及在與它有關的事情之後,顯示我用來調用這個函數的兩行。

$app->map('/api/remove-user'      ,'get_user',$validate_user(array('Admin','Manager','Franchise Admin','Franchise Manager')),$remove_record_for_class('User'))        ->via('GET', 'POST'); 
$app->map('/api/view-user'       ,'get_user',$validate_user(array('Admin','Manager','Franchise Admin','Franchise Manager')),$view_results_for_class('User'))         ->via('GET', 'POST'); 

任何建議表示讚賞!

+1

是否有任何理由使用匿名函數作爲唯一的代碼在另一個函數中我明白它應該工作相同,如果你刪除'返回函數()使用($ allowedUserTypes,$ templateFolder){'和它相應的結尾'}' – Marek

+0

我必須這樣做,因爲slim需要一個函數返回給它的$ app-map()函數,但是我找到了解決方案,我通過調用$ app-> map兩次就犯了一個錯誤,我認爲發生了什麼事是git合併成一個副本,並將我搞砸了。 –

回答

1

原來我偶然運行了兩次$ app-> map('')命令,一次只發送導致錯誤的'Admin'和'Manager'。所以我的一個愚蠢的錯誤:(只是去顯示要注意這個東西