2015-01-08 2 views
0

Для справки я использую SLIM рамкиPHP анонимной функции, использование ключевых слов и переменных Scope Выпуск

Мой вопрос, где вы видите закомментирована 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. 
     } 
    }; 
}; 

Я покажу 2 строки, которые я использую для вызова этой функции прямо перед тем, как назвать его, и после того, как упаковывают, что не имеет ничего общего с ним.

$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

Есть ли причина использовать анонимную функцию как единственный код в другой функции. Я понимаю, что он должен работать так же, если вы remove 'return function() use ($ allowedUserTypes, $ templateFolder) {' и это соответствует завершению '}'. – Marek

+0

Мне пришлось это сделать, потому что slim требует функцию, возвращаемую ей в своей функции $ app-map(), но я нашел решение, я допустил ошибку, дважды позвонив в $ app-> map, я думаю, что произошло, что git слился в копию и напортачил. –

ответ

1

Оказывается, я дважды запускал команду $ app-> map (''), в одном случае отправляя только «Admin» и «Manager», которые вызвали ошибку. Так вот, была глупая ошибка с моей стороны :(Просто идет показать, чтобы следить за этим материалом.

Смежные вопросы