Php 无法使用Symfony 2.2中的细枝访问对象属性值

Php 无法使用Symfony 2.2中的细枝访问对象属性值,php,oop,symfony,web,twig,Php,Oop,Symfony,Web,Twig,我无法使用细枝点符号访问对象属性。例如,通过查看对象转储,我应该能够执行image.copyright,它应该为第一项打印“加勒比开曼群岛附近的蓝色按钮(©Lawson Wood/Aurora Photos)” 我收到的错误消息是 ARRaiDesignBundle中不存在对象“SimpleXMLElement”的方法“copyright”:默认值:第12行的wallpaps.html.twig 使用dump(image)转储对象时,会转储每个对象 控制器类: $host = 'http://w

我无法使用细枝点符号访问对象属性。例如,通过查看对象转储,我应该能够执行image.copyright,它应该为第一项打印“加勒比开曼群岛附近的蓝色按钮(©Lawson Wood/Aurora Photos)”

我收到的错误消息是

ARRaiDesignBundle中不存在对象“SimpleXMLElement”的方法“copyright”:默认值:第12行的wallpaps.html.twig

使用dump(image)转储对象时,会转储每个对象

控制器类:

$host = 'http://www.bing.com';
$file = $host . '/HPImageArchive.aspx?format=xml&idx=0&n=10&mkt=en-US';
$xml = simplexml_load_file($file);

return $this->render('ARRaiDesignBundle:Default:wallpapers.html.twig', array('xml' => $xml, 'host' => $host));
wallpaps.html.twig文件:

...
{% for image in xml %}
<p><pre>{{ image.copyright }}</pre></p>
{% endfor %}
...

有人能建议怎么做吗?我知道我可以使用PHP渲染而不是细枝,但这对我来说不是一个解决方案。谢谢。

在我看来,您的
simplexmlement
没有实现神奇的方法。当您在Twig
object.property
中调用时,它将调用
对象的
getProperty()
方法。尝试直接在细枝中访问属性:

<images>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<tooltips>...</tooltips>
</images>

在我看来,您的
simplexmlement
没有实现神奇的方法。当您在Twig
object.property
中调用时,它将调用
对象的
getProperty()
方法。尝试直接在细枝中访问属性:

<images>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<image>...</image>
<tooltips>...</tooltips>
</images>

这是因为Bing的werid XML结构,最后一点不是迭代友好的。使用标准PHP就可以了,但是使用Twig,它不会捕获最后一个元素的错误

class Element 
{
    protected $xmlElement;
    public function getCopyright() 
    {
        return $this->xmlElement->copyright;
    }
}

...
...
...
...
...
...
...
...
...
要解决这个问题,我只需取消工具提示。“取消设置($xml->工具提示)”


感谢@JaredFarrish提供干净的xml:)

这是由于Bing的werid XML结构,最后一点不是迭代友好的。使用标准PHP就可以了,但是使用Twig,它不会捕获最后一个元素的错误

class Element 
{
    protected $xmlElement;
    public function getCopyright() 
    {
        return $this->xmlElement->copyright;
    }
}

...
...
...
...
...
...
...
...
...
要解决这个问题,我只需取消工具提示。“取消设置($xml->工具提示)”


感谢@JaredFarrish提供干净的xml:)

我认为您必须代理该对象。创建一个包装SimpleXMLElement对象的新对象,并定义getCopyright()方法


我相信你必须代理那个对象。创建一个包装SimpleXMLElement对象的新对象,并定义getCopyright()方法

以php文档为例
在twig中,要从“评级”项中获取属性“类型”,请使用以下属性(“@attributes”):

以php文档为例
在twig中,要从“评级”项中获取属性“类型”,请使用以下属性(“@attributes”):


我已经试过了,但不起作用:ARRaiDesignBundle中不存在类型为“SimpleXMLElement”的对象(具有ArrayAccess)中的键“版权”:默认值:第12行的wallpaps.html.twig可能您的一个对象真的没有这样的属性?您是否尝试过使用
default
filter对其进行迭代
{image['copyright']| default(''')}
@AmarjeetSinghRai否则您可以尝试使用细枝从循环中转储每个对象,并查看哪些属性是可访问的-
{{dump(image)}
,然后不显示任何内容。它确实存在,看看上面的对象转储。我设法在没有symfony的情况下完美地显示了它。这就是我在twig中获得对象转储的原因。[上面]我已经试过了,但不起作用:ARRaiDesignBundle中不存在类型为“SimpleXMLElement”的对象(具有ArrayAccess)中的键“版权”:默认值:第12行的wallpaps.html.twig可能您的一个对象真的没有这样的属性?您是否尝试过使用
default
filter对其进行迭代
{image['copyright']| default(''')}
@AmarjeetSinghRai否则您可以尝试使用细枝从循环中转储每个对象,并查看哪些属性是可访问的-
{{dump(image)}
,然后不显示任何内容。它确实存在,看看上面的对象转储。我设法在没有symfony的情况下完美地显示了它。这就是我在twig中获得对象转储的原因。[上图]这是源代码中输出该行的一行:您试过了吗?@JaredFarrish我使用了您随simplexml_load_string($file)提供的数据。symfony似乎不喜欢bing的xml。因为里面也有。这是一个要迭代的werid结构。虽然,标准php很好,但twigs函数并不完美。您应该搜索是否存在问题,如果没有问题,则报告。以下是源代码中输出该行的行:您尝试过吗?@JaredFarrish我使用了您随simplexml\u load\u string($file)提供的数据。symfony似乎不喜欢bing的xml。因为里面也有。这是一个要迭代的werid结构。虽然标准php还可以,但twigs函数并不完美。您应该搜索是否存在问题,如果没有问题,请报告。
{% for rating in movies.movie.rating %}
   {{ rating.attributes.type }}
{% endfor %}