我假设您希望在发布表单后在控制器中获取此信息,在这种情况下,您可以轻松地从表单对象中获取底层实体,如下所示:
$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,而是希望将表单结构表示为数据。对造成的误解深表歉意 - 希望我能通过更新来纠正这一点。
这是一个概念验证,应该适用于非嵌套形式(尽管为这种情况创建递归版本或其他东西应该很简单)。但是,假设您已经实例化了一个表单,其中包含字段name 和password,如下所示:
$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"
}
}
}
希望这会有所帮助:)