如何通过重定向将数据传递到laravel中的视图

Posted

技术标签:

【中文标题】如何通过重定向将数据传递到laravel中的视图【英文标题】:How to pass data through a redirect to a view in 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

【问题讨论】:

【参考方案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,我该如何解决? 完美运行。谢谢。

以上是关于如何通过重定向将数据传递到laravel中的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 vue 组件传递到 laravel 中的视图(HTML)

将字符串动态传递给 laravel4 中的视图

你如何将所有请求重定向到 laravel 5 中的 public/ 文件夹

如何从 Laravel 的控制器中传递变量到视图

重定向到其他模型的创建视图的 Laravel 背包按钮

markdown Laravel:通过重定向响应传递并获取数据