2016-05-27 2 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')); 
} 

ГЭТ маршрут:

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

И код запроса на пост assign-user формы.

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

...

Update

Хранение $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

Это не сработало. Если I '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

Да, он возвращает меня, чтобы показать ошибку, но если после этого я вставляю ее, она ничего не сохранит в БД. –

Смежные вопросы