2014-09-19 60 views
0

這是從頭開始的項目,所以如果您想要,您可以按照我的說明完成。使用withInput的Laravel重定向不允許更改輸入值

我創建了以下遷移剛剛創建的用戶表並添加新的記錄:

public function up() 
{ 
    Schema::create('users', function ($table) { 
     $table->engine = 'InnoDB'; 
     $table->increments('id'); 
     $table->string('name', 60)->unique(); 
     $table->string('email', 120)->unique(); 
     $table->string('password', 256); 
     $table->rememberToken(); 
     $table->timestamps(); 
    }); 

    DB::table('users')->insert(
     [ 
      [ 
       'name'  => 'admin', 
       'email' => '[email protected]', 
       'password' => Hash::make('password') 
      ] 
     ] 
    ); 
} 

public function down() 
{ 
    Schema::drop('users'); 
} 

我的路線是:

<?php 

Route::get('/', [ 
    'as' => 'main_route', 
    function() { 
     return View::make('hello'); 
    } 
]); 

Route::post('/', [ 
    'as' => 'main_route', 
    function() { 
     if (!Auth::attempt(
      [ 
       'email' => Input::get('email_to_fill'), 
       'password' => Input::get('password_to_fill'), 
      ] 
     ) 
     ) { 


     } 

     return Redirect::route('main_route')->withInput(); 
    } 
]); 


Route::get('/logout', [ 
    'as' => 'logout', 
    function() { 
     Auth::logout(); 
     return Redirect::route('main_route'); 
    } 
]); 

hello.blade.php是:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
</head> 
<body> 
@if (Auth::check()) 
    I'm logged in. E-mail {{ Auth::user()->email }} 

    <a href="{{ URL::route('logout') }}">Log out</a> 

    {{Form::open(['url' => URL::route('main_route'), 'role' => 'form']) }} 

    {{ Form::text('email', Auth::user()->email) }} 


    {{Form::submit()}} 
    {{Form::close() }} 
@else 
{{Form::open(['url' => URL::route('main_route'), 'role' => 'form']) }} 

{{ Form::text('email', 'do not touch this') }} 

{{ Form::text('email_to_fill', '[email protected]') }} 
{{ Form::text('password_to_fill', 'password') }} 

{{Form::submit()}} 
{{Form::close() }} 
@endif 
</body> 
</html> 

沒有什麼複雜至今。

因此,我打開我的瀏覽器主頁面並單擊發送表單(數據已填充到HTML中,因此我不需要填寫任何內容)。

以下圖片:

Page before sending form

Page after login

發送表單後我被登錄,但正如你看到的輸入值是不正確的。在代碼中,它應該顯示在輸入值Auth::user()->email中,但它在發送前從email字段顯示舊值。

問題: - 在使用withInput與重定向它會自動填充具有相同值的所有表單輸入,甚至通過手動其他值將使用舊數據是否正確Laravel行爲?大概這個例子可能會更簡單一些(根本沒有用戶登錄),但這是我面對的確切問題,所以我儘可能簡單地把它放在這裏。

回答

1

這是預期的行爲。我會張貼更深入的答案,但我想不出任何;這就是它的作用:P

爲什麼你可能想要這樣的一個例子是如果你正在編輯一個記錄;它應該從數據庫加載記錄並填充編輯表單。然後你提交,結果驗證失敗。它應該記住您的發佈數據並將其優先於DB值,以便您可以更改它。

如果身份驗證成功,最簡單的修復方法就是不重定向->withInput()

+0

所以它基本上意味着當我有表單時,我不需要在使用withInput時爲任何字段設置值,因爲Laravel會自動填充所有字段的值。如果例如對於一個字段,我想設置其他值,我需要更改此輸入名稱或不使用withInput方法或使用Input :: except?我浪費了大約6個小時將問題縮小到上面的代碼,因爲我認爲這裏的'Auth'存在相當大的問題,而不僅僅是形式。 – 2014-09-19 12:43:04

+0

是的 - 如果你真的需要,我會親自使用'Input :: except',但是你也可以做一些類似於通過插頁式控制器操作(例如'/ login' POSTs到'/ login/process'然後在登錄時轉發到'/ dashboard')。這樣,你可以在失敗時將' - > withInput()'重定向到 – Joe 2014-09-19 13:11:20

+0

事實上,這是更復雜的形式,其中有很多字段,如果用戶沒有登錄,他可以填寫要登錄的字段,如果他重新發送表單並且其他一些數據無效,我想顯示他的用戶數據。現在我知道我可以例如更改這兩個輸入名稱並以其他方式解決它。謝謝 – 2014-09-19 13:14:08

相關問題