Symfony - 表单基础

参考链接: 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值