如何通过重定向将数据传递到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)