代码之家  ›  专栏  ›  技术社区  ›  P S

在laravel 5.5中输入不起作用时重定向回

  •  3
  • P S  · 技术社区  · 6 年前

    我以前多次使用重定向回输入。但在这个项目中,我无法做到这一点。这是我的 控制器 处理表单请求的方法:

    public function verifyMobileCode( Request $request)
    {
            $userId = Auth::user()->id;
            if( Auth::user()->verification_code == $request['verification_code'])
            {
                User::where('id', $userId)->update(['verified'=>1]);
                return redirect('/')->with('success', 'Account verified.');
            }
            else
            {
                return redirect()->back()->withErrors('verification_code' ,'unv' )->withInput($request->all());
            }
    }
    

    这是我的成型刀片:

    @extends('layouts.index')
    
    @section('content')
    
    <div class="container" style='padding-top: 150px;'>
    
        <?php var_dump($errors) ; ?>
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Verify your mobile</div>
    
                    <div class="panel-body">
                        <form class="form-horizontal" method="POST" action="{{ route('verifyMobileCode') }}">
                            {{ csrf_field() }}
    
                            <div class="form-group{{ $errors->has('verification_code') ? ' has-error' : '' }}">
                                <label for="verification_code" class="col-md-4 control-label">Verification code</label>
    
                                <div class="col-md-6">
                                    <input id="verification_code" type="text" class="form-control" name="verification_code" value="{!! old('verification_code') !!}" required autofocus maxlength="6" pattern="\d{6}">
    
                                    @if ($errors->has('verification_code'))
                                        <span class="help-block">
                                            <strong>Please enter 6 digit number sent to your mobile.</strong>
                                        </span>
                                    @endif
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Register
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection
    

    我的内核。php如下:

    <?php
    
    namespace App\Http;
    
    use Illuminate\Foundation\Http\Kernel as HttpKernel;
    
    class Kernel extends HttpKernel
    {
        /**
         * The application's global HTTP middleware stack.
         *
         * These middleware are run during every request to your application.
         *
         * @var array
         */
        protected $middleware = [
            \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \App\Http\Middleware\LanguageSwitcher::class,
            \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
            \App\Http\Middleware\TrimStrings::class,
            \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
            \App\Http\Middleware\TrustProxies::class,
        ];
    
        /**
         * The application's route middleware groups.
         *
         * @var array
         */
        protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                // \Illuminate\Session\Middleware\AuthenticateSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
    
            'api' => [
                'throttle:60,1',
                'bindings',
            ],
        ];
    
        /**
         * The application's route middleware.
         *
         * These middleware may be assigned to groups or used individually.
         *
         * @var array
         */
        protected $routeMiddleware = [
            'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
            'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
            'can' => \Illuminate\Auth\Middleware\Authorize::class,
            'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
            'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
            'is-admin' => \App\Http\Middleware\IsAdminMiddleware::class,
        ];
    }
    

    我没有发现任何错误或错误。你看到什么了吗?有没有 调试此行为的技术? 提前到达塔克斯。

    7 回复  |  直到 6 年前
        1
  •  5
  •   Kyslik    6 年前

    我的方法是 FormRequest

    php artisan make:request VerifyCodeRequest
    

    和请求正文:

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class VerifyCodeRequest extends FormRequest
    {
    
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'verification_code' => 'required|in:'.$this->user()->verification_code, // since user is already logged in we check if verification_code matches using `in` rule
            ];
        }
    
    
        public function messages()
        {
            return [
                'in' => 'Your custom error message if we failed',
            ];
        }
    }
    

    现在您更改的签名 verifyMobileCode(...) 至以下内容 verifyMobileCode(App\Http\Requests\VerifyCodeRequest $request)

    现在,代码执行函数体 只有 我们通过了验证,所以我们需要更新用户实例,我们就完成了。

    public function verifyMobileCode(App\Http\Requests\VerifyCodeRequest $request)
    {
        $request->user()->verify();
        return redirect('/')->with('success', 'Account verified.');
    }
    

    内部用户模型添加 verify() 作用

    public function verify() 
    {
        $this->update(['verified' => true]);
    }
    

    如果您的上述方法不起作用,那么您的 app/Http/Kernel.php .您已使用

    \Illuminate\Session\Middleware\StartSession::class,
    

    两次您必须删除一个。可能是第一个。

    查看Laravel的库存 kernel.php

        2
  •  0
  •   Prabakaran T    6 年前

    代替 ->withInput($request->all()); 具有 ->withInput();

    如果您不需要任何一个输入,请使用

    ->withInput( $request->except('input_name') );

        3
  •  0
  •   Kjartan    6 年前

    要在不诉诸Xdebug的情况下对此进行调试,快速的方法是在刀片文件的开头添加临时调试代码:

    @php
        dd($errors->toArray(), $errors->has('verification_code'));
    @endphp
    

    这将为您提供以下输出:

    array:1 [
      0 => array:1 [
        0 => "verification_code"
      ]
    ]
    false
    

    这表明刀片文件中的逻辑未被评估为 符合事实的 这是显示错误样式和消息所必需的。

    快速修复方法是将控制器更改为使用:

    ->withErrors(['verification_code' => 'unv'])
    

    withErrors期望使用MessageBag或array,但会将字符串转换为数组,而该数组不会生成正确的键/值对。

    调试输出现在将显示:

    array:1 [
      "verification_code" => array:1 [
        0 => "unv"
      ]
    ]
    true
    

    现在可以删除调试代码,错误应按预期显示。

    正确的Laravel方法可能是使用$request->validate()或复杂表单的FormRequest。有关更多信息,请参阅Laravel验证文档( https://laravel.com/docs/5.5/validation )。

        4
  •  0
  •   Fahadi Muhumuza    6 年前

    您的控制器应如下所示:

    public function verifyMobileCode( Request $request)
    {
        $userId = Auth::user()->id;
        if( Auth::user()->verification_code == $request['verification_code'])
        {
            User::where('id', $userId)->update(['verified'=>1]);
            return redirect('/')->with('success', 'Account verified.');
        }
        else
        {
            return redirect()->back()->withErrors('message' ,'Please some errors encountered.' );
        }
    }
    

    并修改此

    <div class="form-group{{ $errors->has('verification_code') ? ' has-error' : '' }}">
    

    对此:

    <div class="form-group>
    @include('errors');
    

    还创建名为 errors.blade.php 在参考资料/视图中输入以下代码:

    @if ($errors->any())
    <div class="card"> //incase bootstrap 4
        <div class="error card-body alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    </div>
    @endif
    

    希望对你有用。但是您不需要显示旧的输入,因为代码将出错或发生了错误。所以没必要

        5
  •  0
  •   Ashutosh Sharma Satish    6 年前
    return redirect()->back()->withInput()->withErrors('verification_code' ,'unv' );
    
        6
  •  0
  •   Soubhagya Kumar Barik    4 年前

    In控制器

    return redirect()->back()->withErrors('verification_code' ,'unv')->withInput();
    

    在视图中

    如果要检索已验证的输入字段值,则需要使用laravel FORM 的类 <form></form> 以及 <input> 字段

    实例

    {{ Form::open(['method' => 'post','url' => 'Your url','class'=>'form-horizontal']) }}
    
         {{ Form::text('verification_code','',['class'=>'form-control']) }}
    
    {{ Form::close() }}
    
        7
  •  0
  •   vknyvz    3 年前

    拉雷维尔8号上的任何人,这应该有用

    return back()->withErrors('your error message is here');
    

    如果你看到 withErrors 函数,第二个参数是键,设置为 default 除非你想让它具体点。