Laravel 5.1中的多步注册

Cih*_*mez 23 php validation laravel

我正在尝试构建多步注册表单.

我有路 /register

第1步 我将此表单发布到第2步

route('register', ['step' => 1])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第2步

我正在获取step1的数据并将其置于隐藏的输入中.并发布到结束注册的第三步.如果成功没问题.但是如果注册失败会发生什么?

route('register', ['step' => 2])
Run Code Online (Sandbox Code Playgroud)

第3步

route('register', ['step' => 3])
Run Code Online (Sandbox Code Playgroud)

如果注册失败,我将用户重定向到第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
    {
        //
    }
Run Code Online (Sandbox Code Playgroud)

如果验证失败,我将重定向到第二步,一切正常.但我看到图片中的表格(步骤1)但我的uri是/ register?step = 2

问题是什么.我哪里弄错了?

更新:(路线定义)

Route::get('/register', [
    'uses'       => 'Auth\AuthController@getRegister',
    'as'         => 'register',
    'middleware' => ['guest'],
]);

Route::post('/register', [
    'uses'       => 'Auth\AuthController@postRegister',
    'middleware' => ['guest'],
]);
Run Code Online (Sandbox Code Playgroud)

更新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);
    }
Run Code Online (Sandbox Code Playgroud)

的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
            {

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

oli*_*ool 6

这是因为您的重定向告​​诉浏览器对register?step=2URL 执行GET请求.在您的getRegister方法中,您不检查step值(因此您看到与GET相同的形式step=1).


我看到两种可能的解决方案

  • 要么你调整你的重定向,以便它做一个POST请求step=2(可能是棘手的)
  • 或者您为GET请求提供不同的页面 step=2

我会建议你第二个选择:

  • 表单step=1应该执行POST step=1,step=2如果一切正常,应该重定向到GET (使用flash cookie传递变量)
  • 表单step=2应该执行POST step=2,step=3如果一切正常,应该重定向到GET (使用flash cookie传递变量)


fmg*_*lez 0

也许你可以尝试这个

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

我希望它对你有用。