【问题标题】:Controller attributes cannot contain non-scalar\/non-null values控制器属性不能包含非标量\/非空值
【发布时间】:2017-02-13 23:21:06
【问题描述】:

我想为我的控制器对象提供这样的 hinclude.js :

{{ render_hinclude(controller("AppBundle:Default:Test"), { 'object': my_object }) }}

不幸的是,我收到了这个错误:

"在渲染模板的过程中抛出了异常 (\"控制器属性不能包含非标量/非空值 (键 \"my_object\" 的值不是标量或空值)。\")

你能帮帮我吗?

提前致谢!

【问题讨论】:

  • 您使用object 作为键而不是my_object?还是缺少另一把钥匙?
  • "object" 是关键,只是一个字符串,而 my_object 它是我的真实对象,在这种情况下它是一个实体,但我也尝试过使用数组。同样的错误,非标量:(
  • 尝试使用my_object.id 而不是my_object

标签: php symfony twig sonata


【解决方案1】:

例外是正确的,当使用render_hinclude() 时,只允许为控制器属性传递标量/空值,因为需要从中生成有效的片段 URI。


为什么?

假设您尝试使用私有属性传递此实体,当为该参数生成 URI 时会发生以下情况:

var_dump(http_build_query(array('object' => $my_object)))

// output: 
// string(0) ""

http://php.net/manual/en/function.http-build-query.php#refsect1-function.http-build-query-parameters

如果query_data 是一个对象,那么只有公共属性会被合并到结果中。


顺便说一句,您提供的语句无效,您应该将此属性传递给controller(...) 函数,如下所示:

{{ render_hinclude(controller("AppBundle:Default:test", {'id': my_object.id })) }}

然后,您的控制器应该具有标量值id 并获取相应的对象。但是,请使用参数解析器功能来避免此步骤:

public function testAction(Object $object) {...}

下一步:

{{ render_hinclude(controller("AppBundle:Default:test", {'object': my_object.id })) }}

【讨论】:

  • 谢谢,它适用于对象 ID,但仍然存在这样的数组问题:{{ render_hinclude(controller("AppBundle:Default:test", {'array': my_array })) } }
  • 如果我的对象是没有 id 的 Symfony\Component\Form\FormView 另一个问题:/ 我不能使用这个技巧!
  • 对于array 值,每个子值也必须是标量,请检查此
  • 然后您需要将id 或实体object 传递给模板来执行此操作
【解决方案2】:

取决于控制器路由定义可能你需要传递对象的 id,所以试试这个:

{{ render_hinclude(controller("AppBundle:Default:Test"), { 'object': my_object.id }) }}

希望有帮助

【讨论】:

  • 另一个问题,如果我的对象是 Symfony\Component\Form\FormView 没有“id”:/ 我不能使用这个技巧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多