#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.php5. если вы внесли какие-либо изменения в конфигурационный файл, попробуйте
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');