【问题标题】:Return form array without rendering返回表单数组而不渲染
【发布时间】:2018-01-31 19:37:11
【问题描述】:

我有一个简单的表格:

...
$builder
    ->add('email', EmailType::class, array(
        'constraints' => [
            new Length(array('min' => 3)),
            new NotBlank(),
            ],
    ))
    ->add('username', TextType::class)
...

我想将该表单作为 JSON 响应返回,而不是在 Twig 模板中呈现它,如下所示:

{
  fields: {
    email: {
      type: 'email',
      constraints: {
        'notBlank',
        lenght: {
          'min': 3
        }
      }
    },
    username: {
      type: 'text'
    }
  }
}

是否可以在不使用像 FOSRestBundle 这样的第三方捆绑包的情况下返回那种 array

【问题讨论】:

    标签: symfony symfony-forms symfony4


    【解决方案1】:

    经过两个小时的搜索,我没有发现任何感兴趣的东西,但基于 answer 我写了这个:

    $user = new User();
    $form = $this->createForm(UserType::class, $user);
    
    foreach ($form->all() as $field) {
    
        $name = $field->getName();
        $options = $field->getConfig()->getOptions();
    
        $fields[$name]['type'] = $field->getConfig()->getType()->getBlockPrefix();
        $fields[$name]['disabled'] = $options['disabled'];
    
        foreach ($options['constraints'] as $constraint) {
    
            $rules = [];
            // Get lowercase constraint name from class.
            $class = strtolower((new \ReflectionClass($constraint))->getShortName());
            switch ($class) {
                case 'length':
                    $rules['min'] = $constraint->min;
                    $rules['max'] = $constraint->max;
                    break;
                // More constraints here.
            }
    
            $fields[$name]['constraints'][$class] = empty($rules) ? true : $rules;
        }
    }
    
    return new JsonResponse(['fields' => $fields]);
    

    这给了我以下结果,我很满意:

    "fields": {
            "email": {
                "type": "email",
                "disabled": false,
                "constraints": {
                    "length": {
                        "min": 3,
                        "max": null
                    },
                    "notblank": true
                }
            },
            "username": {
                "type": "text",
                "disabled": false
            },
            "plainPassword": {
                "type": "repeated",
                "disabled": false,
                "constraints": {
    ...
    

    【讨论】:

    • 你试过内置的 symfony 序列化器吗?
    • 我认为它不是内置的,但你能发布一个示例如何实现我需要的吗?如果功能相同/相似,我会接受。
    • 对不起,我的错。一直在使用 FOSRestBundle 和 JMSSerializer 组合,并认为 symfony serializer 也可以解决问题。使用规范器配置,我能得到的只是:{"email":[],"username":[]}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多