如何将对象转换为字符串(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)?的主要内容,如果未能解决你的问题,请参考以下文章

Timber/Twig - 如何访问组内中继器内的 Wordpress Post 对象

如何将PageRequest对象转换为查询字符串?

在Twig文件Symfony中获取数组对象的值

将PHP转换为Twig

如何使用骆驼杰克逊将 JSONArray 转换为对象列表

将字符串转换为具有重复键的对象到数组