[英]Twig render string variable as array
我們正在使用樹枝渲染引擎,用有效載荷數據填充 json。
或者換句話說:
{
"payload": {
"sld": "{{sld}}",
"tld": "{{tlds}}"
}
}
我正在循環所有變量並“渲染”這些值。 當一切都是字符串時,它工作得很好
{
"payload": {
"sld": "test",
"tld": "com"
}
}
但是,如果任何樹枝變量是數組,它就會崩潰。 或者換句話來說:
{{tlds}} 是數組 === ["com", "net"]
因為它存儲在 json 中,所以我不能在沒有字符串引號“”的情況下編寫它。
預期的結果應該是:
{
"payload": {
"sld": "test",
"tld": ["com", "net"]
}
}
你能幫我解決方案或解決方法嗎?
正如評論中所指出的,您應該為此使用內置的json_encode
過濾器。
也就是說,這樣做只會導致你的 JSON 對象的 HTML 編碼版本。 為了克服這個問題,您還必須使用raw
過濾器。
所以用這個 Twig 襯里:
{{ data | json_encode() | raw }}
和數據如:
$data = [
[
"payload" => [
"sld" => "test",
"tld" => "com"
]
],
[
"payload" => [
"sld" => "test",
"tld" => [
"com",
"net"
]
]
]
];
這會給你這個 JSON(為了可讀性而美化):
[
{
"payload":{
"sld":"test",
"tld":"com"
}
},
{
"payload":{
"sld":"test",
"tld":[
"com",
"net"
]
}
}
]
所有這些都可以在這里測試: https : //twigfiddle.com/i604iv
經過一些測試和頭腦風暴,我決定刪除樹枝渲染器並將其遷移到更簡單的版本。
長話短說,這將呈現所有 {{variable.something}} 之類的語法,並將使用有效負載中的相應值填充它。
如果該值是一個數組,它將對它進行 json 編碼,然后對其進行解碼,以實現請求的功能。
private function renderVariables(array $variables = [], array $payload = [])
{
$rendered = [];
foreach ($variables as $key => $value) {
if (is_array($value)) {
$rendered[$key] = $this->renderVariables($value, $payload);
} else {
$rendered[$key] = $this->replaceMarkdown($value, $payload);
if (strpos($rendered[$key], '[') !== false || strpos($rendered[$key], '{') !== false) {
$rendered[$key] = json_decode($rendered[$key]);
}
}
}
return $rendered;
}
public function replaceMarkdown(string $param, array $argv)
{
return preg_replace_callback('/\{\%\s*(.*)\s*\%\}|\{\{(?!%)\s*((?:[^\s])*)\s*(?<!%)\}\}/i',
function ($field) use ($argv) {
$field = $field[2];
if (strpos($field, '.') !== false) {
$fields = explode('.', $field);
} else {
$fields = array($field);
}
$currentData = $argv; # we should take care for magic before foreach
foreach ($fields as $currentField) {
if (isset($currentData[$currentField])) {
$currentData = $currentData[$currentField];
} else {
return $field . '-not-found';
}
}
if (is_array($currentData)) {
$currentData = json_encode($currentData);
}
return (string)$currentData;
}, $param);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.