【问题标题】:How to pass data through a redirect to a view in laravel如何通过重定向将数据传递到laravel中的视图
【发布时间】:2016-09-25 21:56:36
【问题描述】:

如果我有获取路由,我如何在控制器执行某些操作后通过redirect() 将数据从控制器传递到视图?

应用程序的逻辑是使用user_id 重定向到用户在成功验证其电子邮件后将选择其用户名的视图。

public function confirm($confirmationCode){
 if(!$confirmationCode){
   dd('No se encontró ningún código de verificación en la URL');
 }
 $user = User::where('confirmation_code', $confirmationCode)->first();
 if(!$user){
   dd('Lo sentimos. Este código de confirmación ya ha sido usado.');
 }
 $user->confirmed = 1;
 $user->confirmation_code = null;
 $user_id = $user->user_id;
 $user->save();

 return redirect('assign-username')->with(compact('user_id'));
}

获取路径:

Route::get('assign-username', 'AuthenticationController@showAssignUsernameForm');

还有assign-user表单的post请求代码。

public function assignUsername(){
  $user_id = request()->input('user_id');
  $username = request()->input('username');
  if(User::where('username', '=', $username)->exists()){
    return redirect()->back()->withInput()->withErrors([
    'username' => 'Este usuario ya se encuentra registrado. Intenta nuevamente'
  ]);
  }else{
    DB::table('user')->where('user_id', $user_id)->update(['username' => $username]);
  }
 }

当尝试访问 $user_id 变量时,它说它没有定义。

视图的代码:

@extends('layouts.master')
@section('content')
    <section class="hero">
        <h1><span>Ya estás casi listo.</span>Es hora de seleccionar tu nombre de usuario</h1>
            <div class="form-group">
                <form class="form-group"  method="post" action="assign-username">
                    {!! csrf_field() !!}
                    @if($errors->has('username'))
                        <span class="help-block" style="color:red">
                            <strong>{{ $errors->first('username') }}</strong>
                        </span>
                    @endif
                    <input type="hidden" name="user_id" value="{{ session('user_id') }}">
                    <input type="text" name="username" placeholder="Escribe tu nombre de usuario">
                    <button type="submit" class="btn" name="send">Registrar</button>
                </form>
            </div>
        </section>
@endsection

Laravel 版本:5.2

【问题讨论】:

    标签: php laravel post routes


    【解决方案1】:

    这应该可行:

    public function assignUsername(Request $request)
    {
        $user_id = $request->user_id;
    

    【讨论】:

    • 我将它传递给视图以隐藏输入,但我会尝试你的方法。
    • 它没有用。如果我 dd() $user_id 变量它将为空。
    • 请显示视图。
    • 在问题中添加。
    • 我不明白。您正在重定向到 assign-username,它运行 showAssignUsernameForm() 操作,显示表单(在您的问题中发布视图)。那为什么你的表单使用action="assign-username"?它应该类似于action="{{ action('AuthenticationController@assignUsername') }}"。还有,你为什么用value="{{ session('user_id') }}"?应该是value="{{ $user_id }}"
    【解决方案2】:

    如果您将数据传递给视图,要获取with(compact('user_id')) 之后的信息,您必须通过Session 像这样:

     @if (session('user_id'))
        <input type="hidden" name="user_id" value="{{ session('user_id') }}">           
    @endif
    

    【讨论】:

    • 它按预期工作。但是,如果我引入一个无效的用户名(数据库中已经存在),然后插入一个有效的用户名,它将无法工作。如果我dd() 用户,它将是空白的。你能帮我吗?另外,为什么我以前的方法不起作用,为什么你的方法起作用?
    • 如果您介绍了一个无效的用户名,应用程序会将您带到上一页,并且在那里您介绍了一个有效的用户名,对吗? @AndrésBuitrago
    • 是的,它会让我返回显示错误,但如果之后我插入有效的错误,它将不会在数据库中保存任何内容。
    【解决方案3】:

    ...

    更新

    在隐藏输入中存储$user_id 有点冒险,如果您的用户知道如何更改浏览器(例如 Chrome 开发者控制台)上的值并将其替换为另一个用户 ID,该怎么办?

    与其将其存储在隐藏输入中,不如将其存储为session flash data,它可能是:

    public function confirm($confirmationCode){
        ....
    
        session()->flash('user_id', $user_id); // Store it as flash data.
    
        return redirect('assign-username');
    }
    

    AuthenticationController@showAssignUsernameForm 上告诉 Laravel 保留你的 user_id 以备下次请求:

    public function showAssignUsernameForm() {
        session()->keep(['user_id']);
        // or
        // session()->reflash();
    
        return view('your-view-template');
    }
    

    在您的分配用户名POST 方法中,您可以像这样定义值:

    public function assignUsername(){
        $user_id  = session()->get('user_id');
        $username = request()->input('username');
    
        if(User::where('username', '=', $username)->exists()) {
            session()->flash('user_id', $user_id); // Store it again.
    
            return redirect()->back()->withInput()->withErrors([
                'username' => 'Este usuario ya se encuentra registrado. Intenta nuevamente'
            ]);
        } else {
            DB::table('user')->where('user_id', $user_id)->update(['username' => $username]);
        }
    }
    

    【讨论】:

    • 它有效,感谢您解释对重要数据使用隐藏输入的风险。 (由于我的教授,我陷入了不良习惯)。然而,与下面评论相同的事情正在发生:如果我引入了一个无效的用户名(一个已经在数据库中的用户名),然后我引入了一个有效的用户名,它将不会保存在数据库中。我知道这是因为会话中不再有user_id,我该如何解决?
    • 完美运行。谢谢。
    猜你喜欢
    • 2018-10-20
    • 2019-11-16
    • 2017-11-24
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多