【问题标题】:Symfony2 form to JSON structureSymfony2 形式转 JSON 结构
【发布时间】:2015-12-29 05:24:22
【问题描述】:

Symfony2 表单如何转换为 JSON 数据结构?寻找合适的捆绑包没有给我任何结果;

例子:

$builder
    ->add('name', 'text')
    ->add('password', 'password')
;

会产生类似的结果:

{
    fields: {
        name: {
            type: 'text'
        },
        password: {
            type: 'password'
        }
    }
}

$form = $this->createForm(new FormType(), new Entity()) 之后遍历表单中的每个元素没有帮助,找不到可以在表单构建器中定义的一些属性。

【问题讨论】:

  • 大约 9 个月后我遇到了这个问题,我意识到我的回答并没有解决您的问题!更新了我的答案 - 迟到总比没有好,对吧? :)

标签: php json forms symfony


【解决方案1】:

如果需要获取表单对象的JSON表示,可以获取实体对象并进行编码:

$jsonStr =json_encode($builder->getData());

【讨论】:

    【解决方案2】:

    我假设您希望在发布表单后在控制器中获取此信息,在这种情况下,您可以轻松地从表单对象中获取底层实体,如下所示:

    $entity = $form->getData();
    

    此时,您可以手动将所需的字段拉出到数组中并json_encode(),或者......在您的实体中实现JsonSerializable 接口,然后直接json_encode() 对象本身。

    例如:

    <?php
    
    namespace FooApp/BarBundle/Entity;
    
    use JsonSerializable;
    
    class Baz implements JsonSerializable
    {
        private $name;
        private $password;
    
        // ...
    
        function jsonSerialize()
        {
            return [
                'fields' => [
                    'name'     => ['type' => $this->name],
                    'password' => ['type' => $this->password],
                ],
            ];
        }
    }
    

    然后,在您的控制器中:

    $entity = $form->getData();
    $json = json_encode($entity);
    

    调用json_encode() 将自动调用Baz::jsonSerialize() 并返回您定义的数组结构,该结构又是JSON 编码的。

    2016 年 6 月 23 日更新

    我偶然再次遇到这个问题 - 而且......我意识到我没有回答你的实际问题。

    您不想将表单的基础实体转换为 JSON,而是希望将表单结构表示为数据。对造成的误解深表歉意 - 希望我能通过更新来纠正这一点。

    这是一个概念验证,应该适用于非嵌套形式(尽管为这种情况创建递归版本或其他东西应该很简单)。但是,假设您已经实例化了一个表单,其中包含字段namepassword,如下所示:

    $form = $this->createForm(FooType::class, $foo);
    

    然后应该可以迭代实例并导出结构的表示;例如:

    $fields = ['fields' => []];
    
    foreach ($form->all() as $field) {
        $name = $field->getName();
        $type = $field->getConfig()->getType()->getBlockPrefix();
        $fields['fields'][$name] = ['type' => $type];
    }
    
    echo json_encode($fields, JSON_PRETTY_PRINT);
    

    产量:

    {
        "fields": {
            "name": {
                "type": "text"
            },
            "password": {
                "type": "password"
            }
        }
    }
    

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:

      看看http://jmsyst.com/libs/serializer#installation 和fosrestbundle

      $view = $this->view( $form->createView() );
      return $this->handleView( $view );
      

      做你想要的。

      【讨论】:

        猜你喜欢
        • 2015-10-22
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 2015-12-10
        • 2021-08-23
        相关资源
        最近更新 更多