Многошаговая регистрация в Laravel 5.1
Я пытаюсь создать многошаговую регистрационную форму.
У меня есть маршрут /register
Шаг 1 Я отправляю эту форму на step2
route('register', ['step' => 1])
Шаг 2
И я получаю данные шага 1 и помещаю их внутрь скрытых входов. И отправка на третий шаг для окончания регистрации. Если это успешно, нет проблем. Но что случилось, если регистрация не удалась?
route('register', ['step' => 2])
Шаг 3
route('register', ['step' => 3])
Если регистрация не удалась, я перенаправляю пользователя на шаг 2.
Вот мой код перенаправления.
$new_user = $request->all();
$validator = Validator::make($new_user, $this->rules());
if ($validator->fails())
{
return redirect()->back()
->withInput($new_user)
->withErrors($validator->getMessageBag()->toArray());
}
else
{
//
}
Если проверка не пройдена, я перенаправляю на шаг 2, все в порядке. Но я вижу формы на картинке (Шаг 1) Но мой URI является / зарегистрироваться? Шаг =2
В чем проблема. Где я делаю ошибку?
ОБНОВЛЕНИЕ: (Определения маршрута)
Route::get('/register', [
'uses' => 'Auth\AuthController@getRegister',
'as' => 'register',
'middleware' => ['guest'],
]);
Route::post('/register', [
'uses' => 'Auth\AuthController@postRegister',
'middleware' => ['guest'],
]);
ОБНОВЛЕНИЕ 2: (getRegister и postRegister)
Примечание: я не закончил кодировать getRegister и postRegister.
getRegister
public function getRegister(Request $request)
{
if(!$request->has('step'))
{
/**
* Eğer kayıt ekranında ?step=1,2 vs. yoksa direk ?step=1 e yönlendirme yapıyoruz.
*/
return redirect()->route('register', ['step' => 1]);
}
$countries = (new LocationCountry)->getAllCountries()->toArray();
foreach($countries as $key => $country)
{
$countryNames[$key] = $countries[$key]['translation'] = trans('country.'.$country['code']);
}
array_multisort($countryNames, SORT_STRING, $countries);
/**
* Ülke ve Zaman Dilimi için Varsayılan Seçimi
*/
$default = new \stdClass();
$default->country = (Lang::locale() == 'tr') ? 'TR' : 'US';
$default->timezone = (Lang::locale() == 'tr') ? 'Europe/Istanbul' : 'America/New_York';
$timezones = (new DateController)->getTimeZoneList();
return view('auth.register.index', compact(['timezones', 'countries', 'default']))
->with('orderProcess', TRUE);
}
postRegister
public function postRegister(Request $request){
if(!$request->has('step'))
{
/**
* Eğer kayıt ekranında ?step=1,2 vs. yoksa direk ?step=1 e yönlendirme yapıyoruz.
*/
return redirect()->route('register', ['step' => 1]);
}
if ($request->get('step') == 2)
{
$new_user = $request->all();
$new_user['tc_citizen'] = (!isset($new_user['tc_citizen'])) ? 0 : 1;
$new_user['area_code'] = (new LocationCountry)->getCountryAreaCodeByCode($new_user['country']);
$cities = (new Location)->getCities();
/**
* Eğer Post Durumunda ise ve town değişkeni varsa...
*/
if($request->has('town'))
{
$towns = (new Location)->getTowns($request->get('city'));
if(!$towns->isEmpty())
{
}
}
return view('auth.register.step2', compact(['new_user', 'cities']))
->with('orderProcess', TRUE);
}
if($request->get('step') == 3)
{
/**
* Kayıt Sonuç Sayfası
*/
$new_user = $request->all();
$validator = Validator::make($new_user, $this->rules());
if ($validator->fails())
{
return redirect()->back()
->withInput($new_user)
->withErrors($validator->getMessageBag()->toArray());
}
else
{
}
}
}
2 ответа
Это потому, что ваше перенаправление говорит браузеру выполнить запрос GET на register?step=2
URL. И в твоем getRegister
метод, который вы не проверяете для step
значение (следовательно, вы видите ту же форму, что и для GET step=1
).
Я вижу два возможных решения:
- либо вы настраиваете перенаправление так, чтобы он выполнял POST-запрос к
step=2
(может быть сложно) - или вы обслуживаете другую страницу для запроса GET
step=2
Я бы посоветовал вам второй вариант:
- Форма в
step=1
должен сделать POST, чтобыstep=1
, который должен перенаправить на GETstep=2
если все в порядке (использование flash cookie для передачи переменных) - Форма в
step=2
должен сделать POST, чтобыstep=2
, который должен перенаправить на GETstep=3
если все в порядке (использование flash cookie для передачи переменных)
Может быть, вы можете попробовать это
return redirect()->back()
->withInput(array_merge($new_user, ['step', $step-1]))
->withErrors($validator->getMessageBag()->toArray());
Я надеюсь, что это работает хорошо для вас.