Анонимная функция PHP, использование ключевого слова и проблема с переменной областью

0

Для справки я использую структуру SLIM

Моя проблема заключается в том, что вы видите прокомментированные команды 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 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
    Есть ли причина использовать анонимную функцию в качестве единственного кода в другой функции. Я понимаю, что это должно работать так же, если вы удалите return function() use ($allowedUserTypes, $templateFolder){ и это соответствует окончанию } .
  • 0
    Я должен был сделать это, потому что slim требует функцию, возвращенную ему в его функции $ app-map (), но я нашел решение, я сделал ошибку, дважды вызвав $ app-> map, я думаю, что произошло, git merged in его копию и облажались.
Теги:
scope
slim
anonymous-function

1 ответ

1
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню