2014-04-29 39 views
4

如何訪問twig中的子實體屬性值。例如:從字符串訪問子實體屬性 - Twig/Symfony

這是工作呢:

{% for entity in array %} 
    {{ entity.child.child.prop1 }} 
{% endfor %} 

我不會傳遞s字符串作爲參數去得到同樣的事情:

{% for entity in array %} 
    {{ attribute(entity, "child.child.prop1") }} 
{% endfor %} 

,但我得到的錯誤:

方法對象「CustomBundle \ Entity \ Entity1」 「child.child.prop1」不存在...

有沒有辦法做到這一點?

+0

你爲什麼要這麼做? –

+5

我想你想要https://github.com/fabpot/Twig/issues/1296? – griotteau

+1

該鏈接的摘錄:由於{{屬性(實體,「child.child.prop1」)}} === $實體,您必須執行'attribute(attribute(discussion,'child'),'prop1')' ['child.child.prop1']' –

回答

1

您可以使用symfony的PropertyAccess component函數來編寫custom twig extension以檢索該值。一個例子擴展實現可以像:

<?php 

use Symfony\Component\PropertyAccess\PropertyAccess; 

class PropertyAccessorExtension extends \Twig_Extension 
{ 
    /** @var PropertyAccess */ 
    protected $accessor; 


    public function __construct() 
    { 
     $this->accessor = PropertyAccess::createPropertyAccessor(); 
    } 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('getAttribute', array($this, 'getAttribute')) 
     ); 
    } 

    public function getAttribute($entity, $property) { 
     return $this->accessor->getValue($entity, $property); 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    * 
    */ 
    public function getName() 
    { 
     return 'property_accessor_extension'; 
    } 
} 

registering this extension as service後,您就可以調用

{% for entity in array %} 
    {{ getAttribute(entity, "child.child.prop1") }} 
{% endfor %} 

編碼愉快!

+0

謝謝我打算做這樣的事:) –