如何将对象转换为字符串(Twig & Symfony)?
Posted
技术标签:
【中文标题】如何将对象转换为字符串(Twig & Symfony)?【英文标题】:How can I convert an object to a string (Twig & Symfony)? 【发布时间】:2019-07-18 18:34:17 【问题描述】:我有一个混合了树枝数据的 jquery 函数:
$(document).on('change', '.item-select', function()
var optionValue = $(this).val();
% for key, value in columns_arr %
% for k,v in group %
if (optionValue == " v.id ")
% set output = v %
% for method in value|split('.') if method != '' %
% set output = attribute(output, method) | default('') %
% endfor %
var value | split('.') | first = " output ";
% endfor %
% endfor %
if (optionValue)
var entity = $(this).find(':selected').attr('data-parent');
var relation = $(this).find(':selected').attr('data-slug');
var uuid= $(this).find(':selected').attr('data-id');
table.row.add(
% for key, value in columns_arr %
% for k,v in group %
" value | split('.') | first ": value | split('.') | first ,
% endfor %
% endfor %
).draw();
$('option', this).first().prop('selected', true);
fetch(`/row/$entity/$relation/$uuid/$optionValue`,
method: 'POST'
).then(res => window.location.reload());
);
我收到错误消息:
在渲染模板期间引发了异常 (“可捕获的致命错误:类的对象 Proxies__CG__\App\Entity\Productgroup 无法转换为 字符串")。
而且错误应该在这一行:
var 值 |拆分('.') |第一个 = " 输出 ";
【问题讨论】:
你能给我们一个想法,column_arr
是什么样的?似乎它是Productgroup
实体的数组。您应该调用它们的特定字段(例如 value.name | split('.') | first
)或给这些实体一个__toString
方法。
@Wulf 这是clolumns_arr:array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup" 3 => "category.name" ]
@Jarla - 您的预期输出是什么?不要忘记,您可以通过更改列定义轻松访问对象productgroup
的任何属性。例如productgroup.name
@DarkBee 为了向您演示,这里有两个数组的变体。第一个变体正在工作,第二个变体出现错误。我也需要第二个变体:codeshare.io/5O6mZP
@DarkBee 我想我知道问题出在哪里。在我发送给您的示例代码中,我看到 colums_arr 应该是 array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup.name" 3 => "category.name" ]
而不是 array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup" 3 => "category.name" ]
我认为这是我需要修复的地方
【参考方案1】:
如果给 Twig 一个对象,它会隐式调用该对象的 __toString() 方法。这就是您收到错误消息的方式。
您是否在该对象上寻找变量值?在这种情况下,请使用字段名称(例如 output.something)。
您显然想要做的是将对象用作对象并使用 javascript 函数处理它。最简单的方法通常是使用 json_encode 过滤器,如果你的底层 Symfony/Doctrine 对象是干净的,它将生成一个具有正确编码和所有内容的 JSON 对象。
var value | split('.') | first = " output | json_encode ";
应该可以解决问题。
但老实说,我认为这种代码风格是在自找麻烦。你应该明确地分配你的变量,而不是像你似乎正在做的那样迭代字段名称。
【讨论】:
在 output | json_encode
周围使用引号会使JS
中的输出无用
谢谢。错误消息与您的代码一起消失了。现在的问题是,在我的数据表中,我需要以下字段 8, fred, animals, products
并且使用 json 编码版本,这些字段是 8, "fred", "__initializer__":null,"__cloner__":null,"__isInitialized__":true,"products",
就像我说的,这只有在你有一个合适的对象时才有效,因为它不会做任何聪明的事情,它只会将对象转换为合适的 JSON 表示法。我强烈建议您进行明确的分配,例如“var animals = output.animals; var products = ...” - 如果您有数组(如复数所示),您可能希望在该级别使用 json_encode。如果那里有对象...实现 __toString() 方法。【参考方案2】:
也许您可以尝试在您的实体中实现JsonSerializable
,然后使用其方法__toString()
和jsonSerialize
并根据需要重写它们。
https://www.sitepoint.com/use-jsonserializable-interface/
【讨论】:
以上是关于如何将对象转换为字符串(Twig & Symfony)?的主要内容,如果未能解决你的问题,请参考以下文章