首页 > symfony不用FormBuilder可以?

symfony不用FormBuilder可以?

表单的话可以使用前端设计好的页面来进行嵌套?还是只能用FormBuilder来进行表单创建?如果用自己写的页面post过来的数据如何进行验证跟处理?


最好用他提供的,其实不管你要什么样的布局,都可以自定义的,可以修改表单的主题的,可以自定义一些字段的,如果自己弄的话,自己验证吧!


我感觉用FormBuilder来创建表单更好

  1. 有防止CSRF攻击的token

  2. 结合对象获取数据更方便

  3. Validation更方便

可能刚开始接触时, 是感觉FormBuilder有点麻烦, 熟悉之后感觉还是蛮好用的


完全可以!

其实你的问题的核心在于 如何把 post 过来的数据(Array类型) 映射到 实体(Entity类型)

Form 是对 Entity 与 Request 对象的抽象,也就是说,你 Entity 中的 username 在经过 Form 组件抽象之后,输出是类似于 <input name="entityName[property]" /> 这种格式,其中 property 就是你 entity 中的属性(字段名),在 handleRequest 时,前端提交过来的的值,会被自动映射到 entity 的 property 属性中去,你可以理解为 Form 就是把你的 Entity 变的可交互

那么如果不使用 Form 组件的话怎么办呢?

Symfony 也提供了 Serializer 组件也可以将 Array 映射到 Entity:

你的前端页面:

<form>
    <input type="text" name="username" />
    <input type="text" name="password" />
    <button type="submit">Submit</button>
</form>

你的 Entity:

<?php

namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User
{
    /**
     * @Assert\NotBlank
     */
    protected $username;

    /**
     * @Assert\NotBlank
     */
    protected $password;
    
    public funciton setUsername($username)
    {
        $this->username = $username;
        
        return $this;
    }
    
    public function getUsername()
    {
        return $this->username;
    }
    
    // ...
}

将你的 FORM 映射到实体:

/**
 * $params 就是:
 * array(
 *     'username' => '狗剩',
 *     'password' => '123456'
 * )
 */
$params = $request->request->all();
$entity = $this->get('serializer')
    ->denormalize($params , 'AppBundle\\Entity\\User');

像使用了 Form 那样去证一个 Entity:

$errors = $this->get('validator')
    ->validate($entity);

参考:http://symfony.com/doc/current/components/serializer.html#deserializing-an-object


先回答前两个问题,复杂度很高的表单当然可以用前端设计好的页面来做,FormBuilder不一定是非用不可的。

第三个问题,@xxfaxy 说的要自己验证,在我看来,Symfony已经提供了Validation组件,用Validation的话,我觉得不完全算是自己验证吧。参考Symfony官网,滚动到页面最后,看Validating Values and Arrays这一小节。

我觉得框架虽然提供了很多功能,但那些功能毕竟是具有通用性的,在一些特例的时候,就不要被框架框住了。

【热门文章】
【热门文章】