У меня есть /signup/select-plan
, который позволяет пользователю выбрать план, и /signup/tos
, который отображает условия обслуживания. Я хочу, чтобы /signup/tos
был доступен только из /signup/select-plan
. Поэтому, если я попытаюсь перейти непосредственно к /signup/tos
без выбора плана, я хочу, чтобы это не разрешалось. Как мне это сделать?
Laravel позволяет маршруту быть доступным только с другого маршрута
Ответы (3)
В конструкторе или маршруте (если вы не используете конструкторы) вы можете проверить предыдущий URL-адрес с помощью глобального помощника url()
.
public function tos() {
if ( !request()->is('signup/tos') && url()->previous() != url('signup/select-plan') ) {
return redirect()->to('/'); //Send them somewhere else
}
}
В контроллере /signup/tos
, который возвращает представление tos, просто добавьте следующий код:
$referer = Request::referer();
// or
// $referer = Request::server('HTTP_REFERER');
if (strpos($referer,'signup/select-plan') !== false) {
//SHOW THE PAGE
}
else
{
dd("YOU ARE NOT ALLOWED")
}
Здесь мы проверяем реферер HTTP и разрешаем доступ к странице только в том случае, если пользователь приходит из select-plan.
Вам нужны сеансы в laravel. Дополнительные сведения можно найти в следующих документах: Сессии Laravel
Прежде всего, вам нужно настроить, до какого времени вы хотите иметь переменную сеанса, чтобы вы могли перейти в свой каталог config/sessions.php
и редактировать поля 'lifetime' => 120,
, также вы можете установить expire_on_close
по умолчанию, для него установлено значение false.
Теперь у вас могут быть следующие маршруты:
Route::get('signup/select-plan', 'SignupController@selectPlan');
Route::post('signup/select-token', 'SignupController@selectToken');
Route::get('signup/tos', 'SignupController@tos');
Route::get('registered', 'SignupController@registered');
Теперь в вашем Signupcontroller
у вас может быть что-то вроде этого:
public function selectPlan()
{
// return your views/form...
}
public function selectToken(Request $request)
{
$request->session()->put('select_plan_token', 'value');
return redirect('/signup/tos');
}
Теперь в функции signupController
tos
вы всегда можете проверить значение сеанса и соответствующим образом манипулировать данными.
public function tos()
{
$value = $request->session()->get('select_plan_token');
// to your manipulation or show the view.
}
Теперь, если пользователь зарегистрирован и вам не нужно значение сеанса, вы можете удалить его, выполнив следующие действия:
public function registered()
{
$request->session()->forget('select_plan_token');
// Return welcome screen or dashboard..
}
Этот метод удалит данные из сеанса. Вы можете манипулировать этим. Вы не сможете использовать функцию in tos
, поскольку вы обновляете страницу и хотите, чтобы данные сохранялись. Поэтому лучше удалить его, когда будет выполнен последний шаг или следующий шаг. Надеюсь это поможет.
Примечание. Это всего лишь ссылка. Ознакомьтесь с документацией для получения дополнительной информации и реализуйте ее соответствующим образом.