Сеанс put, похоже, работает неправильно

#php #laravel #session #laravel-5.8 #laravel-session

Вопрос:

Я работаю с Laravel 5.8 и хотел убедиться, что пользователи могут отправлять форму только каждые 2 часа (пока сеанс работает).

Поэтому я попробовал это на контроллере:

 if(Session::has('request_has_been_sent')){
    return redirect()->back()->with('error', 'You just submitted a request and cannot submit a new one');
}else{
    $withDraw = WithdrawWallet::create([
        'balance_value' => $request->balance_wallet,
        'can_draw' => $request->can_draw,
        'shaba_number' => $request->shaba_number,
        'first_name' => $request->first_name,
        'last_name' => $request->last_name,
        'description' => $request->desc,
        'status' => 'pending',
        'user_id' => auth()->user()->usr_id,
    ]);
    Session::put('request_has_been_sent');
}

return redirect()->back()->with('success','Your request was sent');
 

Таким образом, каждый раз, когда пользователь отправляет новый запрос, request_has_been_sent должен быть установлен сеанс.

Поэтому при следующей отправке пользователем формы, если сеанс был еще жив, You just submitted a request and cannot submit a new one появится сообщение.

Но теперь проблема в том, что это не работает. На самом деле пользователь все еще может отправить другой запрос сразу после отправки запроса.

Это означает, что сеанс каким-то образом не задан.

Так что же здесь происходит не так? Как я могу правильно это сделать?

Комментарии:

1. где у вас истекает срок действия этой сессии?

2. @Milad Он должен истечь сам по себе через 2 часа. Я хочу, чтобы этот сеанс был забыт автоматически.

3. вы включили таймер config/session.php досье?

4. @Milad Он установлен 'lifetime' => env('SESSION_LIFETIME', 120), на config/session.php

5. если вы внесли какие-либо изменения в конфигурационный файл, попробуйте php artisan optimize перезагрузить кэш

Ответ №1:

Вы можете установить сеанс с помощью set и put метода

 Session::put('name','value');
 

Извлеките его с помощью get

 Session::get('name')
 

Поэтому в вашем случае вам нужно настроить использование сеанса

 Session::put('request_has_been_sent','yes');
 

И чтобы проверить, установлен он или нет, используйте

 if(Session::get('request_has_been_sent')){
 

Документы: https://laravel.com/docs/5.0/session

Комментарии:

1. Удивительно, что Session::has() в этом случае проверка сеанса не работает !!

2. @nagidi Session::has() проверяет, установлен ли сеанс ранее без какого-либо значения, также он вернет значение true, если он установлен. но использование Session::get() вернет значение сеанса. поэтому, если он не имеет никакого значения, он вернет значение false. В вашем случае вам нужно обязательно удалить значение из сеанса request_has_been_sent через 2 часа.

Ответ №2:

Я думаю, что ваша единственная проблема здесь заключается в том, что вы не устанавливаете значение сеанса на то, что вам нужно, чтобы установить его на что-то, иначе laravel проигнорирует его.

 Session::put('request_has_been_sent', true);

// Check if it exists, this will check if it exists without getting it
Session::has('request_has_been_sent')
 

Ответ №3:

Как только пользователь выйдет из системы, все данные пользователя будут удалены. Это означает, что пользователь и создает и WithdrawWallet и выходит из системы, а затем снова входит в систему, а затем пользователь может создать другого WithdrawWallet , чтобы исправить это, вы можете использовать кэш

 $cacheKey = WithdrawWallet::class.'.'.auth()->user()->usr_id;

    if (Cache::has($cacheKey)) {
        return redirect()->back()->with('error', 'You just submitted a request and cannot submit a new one');
    } else {
        $withDraw =  Cache::remember($cacheKey, now()->addHours(2), function () use ($request){
            return  WithdrawWallet::create([
                'balance_value' => $request->balance_wallet,
                'can_draw' => $request->can_draw,
                'shaba_number' => $request->shaba_number,
                'first_name' => $request->first_name,
                'last_name' => $request->last_name,
                'description' => $request->desc,
                'status' => 'pending',
                'user_id' => auth()->user()->usr_id,
            ]);
        });
    
    }

    return redirect()->back()->with('success', 'Your request was sent');