【问题标题】:Access to object property insed an arary on twig访问 twig 中数组内的对象属性
【发布时间】:2018-08-10 08:18:21
【问题描述】:

模板有这个数据({{ dump(extra) }}的结果)

array (size=4)
  0 => 
    object(MyProject\Entity\Translation)[210]
      private 'language' => 
        object(Proxies\__CG__\MyProject\Entity\Language)[225]
          public '__initializer__' => null
          public '__cloner__' => null
          public '__isInitialized__' => boolean true
          private 'code' (MyProject\Entity\Language) => string 'es' (length=2)
          private 'id' (MyProject\Entity\Language) => int 70
      private 'entity' => string 'Reason' (length=6)
      private 'entityId' => int 10000
      private 'field' => string 'text' (length=4)
      private 'text' => string 'No quiero recibir emails' (length=24)
  1 => 
    object(MyProject\Entity\Translation)[224]
      private 'language' => 
        object(Proxies\__CG__\MyProject\Entity\Language)[225]
          public '__initializer__' => null
          public '__cloner__' => null
          public '__isInitialized__' => boolean true
          private 'code' (MyProject\Entity\Language) => string 'es' (length=2)
          private 'id' (MyProject\Entity\Language) => int 70
      private 'entity' => string 'Reason' (length=6)
      private 'entityId' => int 10001
      private 'field' => string 'text' (length=4)
      private 'text' => string 'No me gusta la web' (length=18)
  2 => 
    object(MyProject\Entity\Translation)[223]
      private 'language' => 
        object(Proxies\__CG__\MyProject\Entity\Language)[225]
          public '__initializer__' => null
          public '__cloner__' => null
          public '__isInitialized__' => boolean true
          private 'code' (MyProject\Entity\Language) => string 'es' (length=2)
          private 'id' (MyProject\Entity\Language) => int 70
      private 'entity' => string 'Reason' (length=6)
      private 'entityId' => int 10002
      private 'field' => string 'text' (length=4)
      private 'text' => string 'No tengo ningún motivo' (length=23)
  3 => 
    object(MyProject\Entity\Translation)[221]
      private 'language' => 
        object(Proxies\__CG__\MyProject\Entity\Language)[225]
          public '__initializer__' => null
          public '__cloner__' => null
          public '__isInitialized__' => boolean true
          private 'code' (MyProject\Entity\Language) => string 'es' (length=2)
          private 'id' (MyProject\Entity\Language) => int 70
      private 'entity' => string 'Reason' (length=6)
      private 'entityId' => int 10003
      private 'field' => string 'text' (length=4)
      private 'text' => string 'Otros' (length=5)

但我正在尝试访问对象属性,但未打印选择中的选项。

{{ dump(extra) }}
<select id="motivos_baja" name="motivos_baja" class="form-control">
      <option value="0" selected>Seleccione un motivo</option>
            {% for extra in reason%}
             <option value="{{ reason.getEntityId() }}">{{ reason.getText() }}</option>
             {% endfor %}    
 </select>

对象是doctrine 实体。

【问题讨论】:

  • {{ reason.entityId }}{{ reason.text }}
  • 这个方法我已经试过了,还是不行
  • 你错过了{% for extra in reason%}中的一个空格
  • @gogaz - 这没关系。 Twig 能够自行解决此问题。这意味着如果该属性是公共的,twig 将直接使用对该属性的访问权限,否则它将尝试使用该属性的getter
  • @MickaelLeger 这也是不正确的。见here,间距无所谓

标签: php doctrine twig


【解决方案1】:

首先,你必须修复循环;在 Twig 中,for 循环用作 for item in list:

{% for reason in extra %}
    {# ... #}
{% endfor %}    

其次,看起来实际原因是MyProject\Entity\Translation 对象的属性。我假设实体有一些吸气剂,因此您可以通过以下方式访问原因文本:

{{ reason.getEntity().getText() }}

【讨论】:

  • 您的第二个陈述是错误的。集合extra 包含Translation 类型的对象,该对象具有直接属性text
  • {{ reason.getEntity().getText() }} 不支持 {{ reason.text }}
  • @DarkBee:是的,但它是私有财产。此外,由于它位于Translation 实体上,因此假设此对象上的getText getter 将返回Reason 子实体的文本是不安全的(根据@afsdi3,它显然会这样做。)因此,我的说法没有错;但是在这种情况下,有一个捷径。
  • @lxg 如果属性是私有的,twig 将自动使用 getter(如果存在),否则会抛出错误 getter 不存在 - 同样reason 确实有属性 @ 987654337@ 但它是一个字符串,所以调用getText 会导致错误calling getText on non-object
  • @DarkBee:你说得对,entity 属性是一个字符串……我没想到并监督了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多