参考链接: http://symfony.com/doc/current/forms.html#forms-type-reference
声明:本文中的所有代码示例均来自Symfony官网
创建表单
在Symfony中创建表单的流程大致是:
- 创建表单对应的Entity
- 在Controller中使用Form组件创建和设置表单
- 在视图中渲染表单
创建Entity
Entity中的属性应当与表单中的字段一致。例如,假设我们要创建一个todo list,流程大致是:
- 用户填写task名称
- 设置完成日期
- 提交
所以,Task的Entity结构大致如下:
class Task
{
protected $task;
protected $dueDate;
public function getTask()
{
return $this->task;
}
public function setTask($task)
{
$this->task = $task;
}
public function getDueDate()
{
return $this->dueDate;
}
public function setDueDate(\DateTime $dueDate = null)
{
$this->dueDate = $dueDate;
}
}
创建和设置Form表单
创建Form表单的流程大致是:
- 实例化Entity,因为表单的创建依赖于Entity
- 创建、设置表单
- 生成完整的Form,作为参数,传递给视图
代码逻辑如下:
class DefaultController extends Controller
{
public function newAction(Request $request)
{
// create a task and give it some dummy data for this example
$task = new Task();
$task->setTask('Write a blog post');
$task->setDueDate(new \DateTime('tomorrow'));
$form = $this->createFormBuilder($task)
->add('task', TextType::class)
->add('dueDate', DateType::class)
->add('save', SubmitType::class, array('label' => 'Create Post'))
->getForm();
return $this->render('default/new.html.twig', array(
'form' => $form->createView(),
));
}
}
渲染表单
渲染表单的流程
- form_start 渲染开始标签,包括对enctype的设置,例如:上传文件
- form_widget 渲染所有字段,包括field字段本身、label标签、对应的错误验证信息(validation error messages)
- form_end 渲染结束标签。可以在此加入hidden fields,以及防CSRF攻击的token
twig示例:
验证表单
验证流程
用户提交表单数据,接下来就要把数据设置为对应的Entity属性值。
表单验证的逻辑大致是:
- 将用户请求写入Form对象
- Form对象判断用户请求是否为Form的Submit动作
- 是,则验证数据有效性;有效,则更新Entity
代码示例:
public function newAction(Request $request)
{
// just setup a fresh $task object (remove the dummy data)
$task = new Task();
$form = $this->createFormBuilder($task)
->add('task', TextType::class)
->add('dueDate', DateType::class)
->add('save', SubmitType::class, array('label' => 'Create Task'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$task = $form->getData();
// ... perform some action, such as saving the task to the database
// for example, if Task is a Doctrine entity, save it!
// $em = $this->getDoctrine()->getManager();
// $em->persist($task);
// $em->flush();
return $this->redirectToRoute('task_success');
}
return $this->render('default/new.html.twig', array(
'form' => $form->createView(),
));
}
验证机制
Form组件根据Entity中针对属性所做的设置来验证字段的有效性,这里包含两个重点
- Entity中的属性需要被设置,例如非空、数据类型、字节数等等
- Form表单中字段的有效行,实际上是Entity中属性的有效性
设置Entity属性,示例:
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Task
{
/**
* @Assert\NotBlank()
*/
public $task;
/**
* @Assert\NotBlank()
* @Assert\Type("\DateTime")
*/
protected $dueDate;
}
(完)