在開發 Laravel 應用的時候,通常都會涉及到表單的處理,針對如何優雅處理和複用 Laravel 的 Form 表單,下面是小小的人生經驗:
使用 Form Package
雖然寫原生的 HTML 程式碼可讀性確實高了,但是其實 Form Package 還是會帶給我們很多的便利,比如在使用 Form::model()
和 Form::select()
的時候。
想象這樣一個例子:我們需要新增或者更新使用者的使用者名稱
我們可以設計類似這樣的程式碼和目錄結構:
// 位於 resources/views/users/edit.blade.php
{!! Form::model($user, [`route` => [`users.update`, $user->id], `method` => `put`]) !!}
@include(`users._form`)
// Your cancel / update buttons
{!! Form::close() !!}
// 位於 resources/views/users/_form.blade.php
<div class="form-group">
{!! Form::label(`name`, `Name`) !!}
{!! Form::text(`name`) !!}
</div>
上面的 Form
生成的 HTML 程式碼大概是這個樣子:
<form method="POST" action="http://example.com/users/1" accept-charset="UTF-8">
<input name="_token" type="hidden" value="Q5oILhAr92pVqfE0ZSSXjSdJuUi09DVSPWweHQlq">
<input name="_method" type="hidden" value="PUT">
<div class="form-group">
<label for="name">Name</label>
<input name="name" type="text" value="Michael">
</div>
</form>
注意在 Form::model()
方法中,我們之間傳遞了 $user
變數,這也就是說:如果 $user
存在 name
屬性的值,表單就會自動填充該值,都不用我們手動寫。
第二點就是,既然我們是要傳遞 $user
到 Form::model()
中,我們可以在控制器中使用這樣的小技巧:
class UserController extends Controller
{
public function create()
{
return view(`users.create`, [`user` => new User]);
}
public function edit(User $user)
{
return view(`users.edit`, [`user` => $user]);
}
}
這樣的話,你在編輯和新增的時候都不會存在衝突,編輯更新的時候有 name
的值,新增的時候就不用有 name
的值。所以我們可以把整個 Form 表單寫成類似下面這個:
// 位於 resources/views/users/_form.blade.php
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" value="{{ old(`name`, $user->name) }}" class="form-control">
</div>
這樣就大功告成啦!
最後
還是那句話:在表單處理的時候還是可以考慮一下 Form Package ,特別是你在處理 <select>
的時候,你會想念 Form Package 的。