Многошаговая регистрация в 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, который должен перенаправить на GET step=2 если все в порядке (использование flash cookie для передачи переменных)
  • Форма в step=2 должен сделать POST, чтобы step=2, который должен перенаправить на GET step=3 если все в порядке (использование flash cookie для передачи переменных)

Может быть, вы можете попробовать это

return redirect()->back()
     ->withInput(array_merge($new_user, ['step', $step-1]))
     ->withErrors($validator->getMessageBag()->toArray());

Я надеюсь, что это работает хорошо для вас.

Другие вопросы по тегам