Symfony2形式为JSON结构

时间:2015-10-01 08:24:38

标签: php json forms symfony

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

示例:

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

会产生类似的结果:

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

$form = $this->createForm(new FormType(), new Entity())无效之后迭代表单中的每个元素,找不到可以在表单构建器中定义的某些属性。

3 个答案:

答案 0 :(得分:8)

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

$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-06-23

我偶然发现了这个问题 - 而且......我意识到我没有回答你的实际问题。

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

这是一个概念验证,应该适用于非嵌套表单(尽管创建递归版本应该是直接的,或者适用于该情况)。但是,假设您已实例化表单的方案,包括字段namepassword,如下所示:

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

然后可以迭代实例并导出结构的表示; e.g:

$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"
        }
    }
}

希望这会有所帮助:)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

你在找什么。