2012-01-16 24 views
0

我正在使用模式'class table inheritance',并有一个引用我的parrent类的对象。 例如:如何在Symfony 2中渲染树枝模板作为对象类型的函数

class Pet { 
    protected $id; 

    protected $age; 
} 

class Dog extends Pet { 
    protected $ownedBones; 
} 

class Cat extends Pet { 
    protected $killedBirds; 
} 

class Owner { 
    private $pets; 
} 

现在我想树枝选择好的模板来渲染我的儿子对象的类型的函数。所以猫可以有一个超级猫的div和我的狗也可以有他们的酷模板。 我试图做这样的事情:

{%for pet in owner.pets%} 
    <div class="pet"> 
     {{ pet }} 
    </div> 
{%endfor%} 

我得到一个不错的:

Fatal Error: Object of class 'the right type of object' could not be converted to string in ...

所以我可能是一个答案接近? 我是一种树枝新手,所以任何帮助将被重视。

+0

Did你尝试给你的类添加一个'__toString()'函数?我希望枝会自动使用它。试着用简单的东西,比如'return $ this-> name;'。 – Maerlyn 2012-01-17 09:35:16

+0

但是,如果我这样做没有把{%raw%} {%endraw%}(可能导致坏东西),我会得到“

blabla
”在我的页面中,我也不想要。 – Azr 2012-01-17 20:10:58

回答

2

您应该在类Pet中添加一个抽象方法。 IE:

class Pet 
{ 
    abstract function render(); 
} 

比在你的孩子类中你应该实现这个方法。例如:

class Dog extends Pet 
{ 
    public function render() 
    { 
     return sprintf('<div class="dog">%s</div>', 'blabla'); 
    } 
} 

在你的模板,只需调用render方法:

{{ pet.render() }} 

否则你总是可以创建一个getTemplate()共享的方法anche包括它在树枝:{% include pet.template %}

+0

是的,这是一个解决方案谢谢,但是,如果我想要干净,这种方法不应该在一个班级,对不对? – Azr 2012-01-17 07:38:18

+1

您可以随时创建一个'getTemplate()'共享方法,并将它包含在树枝中:'{%include pet.template%}' – 2012-01-17 15:48:57

+0

如何更好!聪明的主意,但:D谢谢 编辑:现在尝试 – Azr 2012-01-17 20:10:21

0

刚刚拿到另一个方式>不要尝试检查类型,检查属性:

{% if pet.ownedBones is defined %} 
woot that's a dog 
{% else %} 
it's somthing else 
{% endif %}