Symfony

来源:互联网 发布:神优化大型单机游戏 编辑:程序博客网 时间:2024/04/24 20:51

参考链接: http://symfony.com/doc/current/forms.html#forms-type-reference

声明:本文中的所有代码示例均来自Symfony官网

创建表单

在Symfony中创建表单的流程大致是:

  1. 创建表单对应的Entity
  2. 在Controller中使用Form组件创建和设置表单
  3. 在视图中渲染表单

创建Entity

Entity中的属性应当与表单中的字段一致。例如,假设我们要创建一个todo list,流程大致是:

  1. 用户填写task名称
  2. 设置完成日期
  3. 提交

所以,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表单的流程大致是:

  1. 实例化Entity,因为表单的创建依赖于Entity
  2. 创建、设置表单
  3. 生成完整的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(),        ));    }}

渲染表单

渲染表单的流程

  1. form_start 渲染开始标签,包括对enctype的设置,例如:上传文件
  2. form_widget 渲染所有字段,包括field字段本身、label标签、对应的错误验证信息(validation error messages)
  3. form_end 渲染结束标签。可以在此加入hidden fields,以及防CSRF攻击的token

twig示例:

验证表单

验证流程

用户提交表单数据,接下来就要把数据设置为对应的Entity属性值。

表单验证的逻辑大致是:

  1. 将用户请求写入Form对象
  2. Form对象判断用户请求是否为Form的Submit动作
  3. 是,则验证数据有效性;有效,则更新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中针对属性所做的设置来验证字段的有效性,这里包含两个重点

  1. Entity中的属性需要被设置,例如非空、数据类型、字节数等等
  2. 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;}

(完)

0 0
原创粉丝点击