搜索

首页  >  问答  >  正文

symfony3 - symfony不用FormBuilder可以?

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

天蓬老师天蓬老师2804 天前484

全部回复(4)我来回复

  • 漂亮男人

    漂亮男人2017-05-16 16:45:53

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

    1. 有防止CSRF攻击的token

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

    3. Validation更方便

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

    回复
    0
  • 怪我咯

    怪我咯2017-05-16 16:45:53

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

    回复
    0
  • PHP中文网

    PHP中文网2017-05-16 16:45:53

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

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

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

    回复
    0
  • 迷茫

    迷茫2017-05-16 16:45:53

    完全可以!

    其实你的问题的核心在于 如何把 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

    回复
    0
  • 取消回复