Laravel позволяет маршруту быть доступным только с другого маршрута

У меня есть /signup/select-plan, который позволяет пользователю выбрать план, и /signup/tos, который отображает условия обслуживания. Я хочу, чтобы /signup/tos был доступен только из /signup/select-plan. Поэтому, если я попытаюсь перейти непосредственно к /signup/tos без выбора плана, я хочу, чтобы это не разрешалось. Как мне это сделать?


person Paul Lucero    schedule 03.03.2017    source источник
comment
в простом на этом контроллере добавьте конструктор авторизации...   -  person Ramzan Mahmood    schedule 03.03.2017
comment
Сохраняете ли вы данные независимо от того, выбран ли выбранный план?   -  person Nitish Kumar    schedule 03.03.2017
comment
@NitishKumar да. и я хочу, чтобы эти данные сохранялись даже после обновления страницы в /signup/tos. Я хочу, чтобы эти данные удалялись только в том случае, если пользователь переходит на другую страницу.   -  person Paul Lucero    schedule 03.03.2017


Ответы (3)


В конструкторе или маршруте (если вы не используете конструкторы) вы можете проверить предыдущий URL-адрес с помощью глобального помощника url().

public function tos() {
    if ( !request()->is('signup/tos') && url()->previous() !=  url('signup/select-plan') ) {
        return redirect()->to('/'); //Send them somewhere else
    }
}
person EddyTheDove    schedule 03.03.2017
comment
позволяет ли это мне обновить страницу /signup/tos после перехода из /signup/select-plan? - person Paul Lucero; 03.03.2017

В контроллере /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.

person Shakti Phartiyal    schedule 03.03.2017
comment
позволяет ли это мне обновить страницу /signup/tos после перехода из /signup/select-plan? - person Paul Lucero; 03.03.2017
comment
Нет, я не думаю, что это позволит вам сделать это. - person Shakti Phartiyal; 03.03.2017
comment
Пожалуйста, пройдите через это: stackoverflow.com/questions/23195987/ - person Shakti Phartiyal; 03.03.2017

Вам нужны сеансы в 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, поскольку вы обновляете страницу и хотите, чтобы данные сохранялись. Поэтому лучше удалить его, когда будет выполнен последний шаг или следующий шаг. Надеюсь это поможет.

Примечание. Это всего лишь ссылка. Ознакомьтесь с документацией для получения дополнительной информации и реализуйте ее соответствующим образом.

person Nitish Kumar    schedule 03.03.2017