php - Laravel 5.1 中的多步注册

标签 php validation laravel

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

我有一个路线/register

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

route('register', ['step' => 1])

enter image description here

第 2 步

我正在获取 step1 的数据并将其放入隐藏的输入中。并发布到第三步以结束注册。如果成功就没有问题。但是如果注册失败怎么办?

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 是/register?step=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 的编码。

获取注册

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);
    }

注册后

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
            {

            }
        }
    }

最佳答案

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


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

  • 要么调整重定向,使其向 step=2 发出 POST 请求(可能很棘手)
  • 或者您为 step=2
  • 的 GET 请求提供不同的页面

我会建议您选择第二个选项:

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

关于php - Laravel 5.1 中的多步注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744526/

相关文章:

php - 如何在Sublime文字代码段中转义$

php - 如何清理此 if/else 语句? (重构)

java - 使用 EL 函数

javascript - 从出生日期开始验证年龄

php - 在值中使用逗号进行 Laravel 验证

php - laravel中如何删除多个id?

PHP + MySQL : How much programming can or should I include within a db transaction?

javascript - 如何在给定的 JavaScript 代码中使变量动态化?

javascript - 对具有相同名称的输入进行步骤表单验证

laravel - 多个正则表达式对于 laravel 中具有不同验证消息的单个输入