2016-05-27 67 views
1

如果我通過redirect()對某個視圖執行某些操作後,如何從控制器傳遞數據(如果我有獲取路由的話)?如何通過重定向將數據傳遞到laravel中的視圖

該應用程序的邏輯是重定向到一個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')); 
} 

的get路線:

Route::get('assign-username', '[email protected]'); 

而對於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

回答

2

...

更新

上的隱藏輸入存儲$user_id是有點冒險,怎樣,如果你的用戶知道如何改變瀏覽器的值,如Chrome開發者控制檯,並替換另一個用戶名?

而不是將其存儲在隱藏輸入我將它存儲爲session flash data,則可能是:

public function confirm($confirmationCode){ 
    .... 

    session()->flash('user_id', $user_id); // Store it as flash data. 

    return redirect('assign-username'); 
} 

[email protected]告訴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]); 
    } 
} 
+0

它的工作原理和感謝您解釋爲重要數據使用隱藏輸入的風險。 (由於我的教授而陷入困境的不良習慣)。然而,與以下評論相同的事情正在發生:如果我引入了一個無效的用戶名(一個已經在數據庫中的用戶名),然後我引入了一個有效的用戶名,它將不會保存在數據庫中。我知道這是因爲它不會再在會話中擁有'user_id',我該如何解決這個問題? –

+0

我編輯了我的答案,讓我知道它是否有效。 – Rifki

+0

完美無瑕。謝謝。 –

0

這應該工作:

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

我將它傳遞給隱藏的輸入視圖,但我會嘗試你的方法。 –

+0

它沒有工作。如果我dd()'$ user_id'變量,它將爲空。 –

+0

請展示視圖。 –

0

如果你將數據傳遞到視圖,with(compact('user_id'))後得到的信息你必須這樣做,通過Session這樣:

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

它按預期工作。但是,如果我引入一個無效的用戶名(已存在於數據庫中),然後插入一個有效的用戶名,它將無法工作。如果我'dd()'用戶它將是空白的。你能幫我嗎?另外,爲什麼我以前的方法不能工作,爲什麼你的工作? –

+0

如果您引入了無效的用戶名,則應用程序會將您帶到上一頁,並在那裏介紹有效的權利? @AndrésBuitrago –

+0

是的,它讓我回來顯示錯誤,但如果在此之後插入有效的錯誤,它將不會在DB上保存任何內容。 –

相關問題