在开发 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 的。