2016-05-27 8 views
1

コントローラにデータを渡すにはどうすればよいのですか?を経由してビューに特定のアクションを実行したら、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を保存

更新が

少し危険で、どのようにあなたのユーザーは、このようなクロームデベロッパーコンソールとしてブラウザ上の値を変更し、別のと交換する方法を知っていればユーザーID?私はsession flash dataとしてそれを格納します

むしろ隠された入力にそれを保存するよりも、それは次のようになります。

public function showAssignUsernameForm() { 
    session()->keep(['user_id']); 
    // or 
    // session()->reflash(); 

    return view('your-view-template'); 
} 

とオン:[email protected]オン

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

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

    return redirect('assign-username'); 
} 

は、次の要求のためにあなたのuser_idを保つためにLaravelを伝えます代入ユーザ名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

重要なデータに隠れた入力を使用するリスクを説明してくれてありがとう。 (私の教授のせいで私にはまった悪い習慣)。しかし、以下のようにコメントされているのと同じことが起こっています。無効なユーザー名(既にデータベース上にあるユーザー名)を導入し、有効なユーザー名を導入するとDBに保存されません。私はそれがセッションで 'user_id'をもはや持っていないことを知っています、どうすればこれを整理できますか? –

+0

私は自分の答えを編集しました。それが働いているかどうか教えてください。 – Rifki

+0

完璧に動作します。ありがとうございました。 –

0

これは動作するはずです:

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

私はそれを隠し入力としてビューに渡していましたが、私はあなたのアプローチを試みます。 –

+0

動作しませんでした。 '$ user_id'変数を' dd() 'すると、nullになります。 –

+0

ビューを表示してください。 –

0

あなたはwith(compact('user_id'))後の情報を取得するには、ビューにデータを渡している場合次のようにSessionを実行する必要があります。

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

期待どおりに動作しました。しかし、無効なユーザー名(すでにDBに存在する)を導入し、有効なユーザー名を挿入しても機能しません。ユーザーを '' dd()すると、それは空白になります。私を助けてくれますか?また、私の以前のアプローチはなぜ機能しなかったのですか? –

+0

無効なユーザー名を入力すると、アプリケーションは前のページに移動します。 @AndrésBuitrago –

+0

はい、エラーを表示するために私を取りますが、その後に有効なものを挿入するとDBに何も保存されません。 –

関連する問題