想象一下,我有一个文章实体,并且在这个实体中有一个报告属性,它是一个json_array类型。
Json_array的数据,如{"key1":"value1","ke2":"value2",...}
。
现在我不知道如何使用symfony表单来渲染和保存这些json_array,就像其他普通属性(例如标题)一样。
我搜索了许多文章,但我还没有找到明确的方法来实现它。
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var array
*
* @ORM\Column(name="report", type="json_array")
*/
private $report;
}
答案 0 :(得分:0)
这是我的看法。听起来你需要在集合和变换器中使用自定义表单类型。我们的想法是,您创建一个自定义表单类型来容纳您的键/值对,让我们称之为KeyValueType
。接下来,您要使用ArticleType
作为包装器将此类型添加到CollectionType
。为了将json转换为表单的可用数据结构,反之亦然,使用变换器。
KeyValueType
类:
class KeyValueType extends AbstractType
{
public function buildForm($builder, $options)
{
$builder
->add('key')
->add('value');
}
}
ArticleType
类:
class ArticleType extends AbstractType
{
public function buildForm($builder, $options)
{
$builder
->add('report', CollectionType::class, [
'entry_type' => KeyValueType::class,
'allow_add' => true,
'allow_delete' => true,
]);
$builder->get('report')
->addModelTransformer(new CallbackTransformer(
function ($reportJson) {
// $reportJson has the structure {"key1":"value1","ke2":"value2",...}
if ($reportJson == null) {
return null;
}
$data = [];
foreach (json_decode($reportJson, true) as $key => $value) {
$data[] = ['key' => $key, 'value' => $value];
}
return $data;
},
function ($reportArray) {
// $reportArray has the structure [ [ 'key' => 'key1', 'value' => 'value1'], [ 'key' => 'key2', 'value' => 'value2'] ]
if ($reportArray == null) {
return null;
}
$data = [];
foreach ($reportArray as $report) {
$data[$report['key']] = $report['value'];
}
return json_encode($data);
}
));
}
}