【问题标题】:How do I output data from a related object in a Twig template?如何从 Twig 模板中的相关对象输出数据?
【发布时间】:2012-09-13 08:59:11
【问题描述】:

我对 Symfony2 还是很陌生,所以请放轻松。我正在尝试遍历一个航班表(用于机票预订系统),其中包含几个相关字段,例如航空公司和机场。我在自定义存储库中使用以下方法:

public function getAllFlights($limit = 100)
{
    $dql = 'SELECT f FROM Flightcase\BookingBundle\Entity\Flight f';

    $query = $this->getEntityManager()->createQuery($dql);
    $query->setMaxResults($limit);

    return $query->getResult();
}

getAllFlights() 像这样被传递给我的 Twig 模板:

$flights = $em->getRepository('FlightcaseBookingBundle:Flight')->getAllFlights();   

return $this->render('FlightcaseBookingBundle:Flight:list.html.twig', array('flights' => $flights));

Twig 模板只是像这样循环遍历 $flights 集合中的项目:

{% for flight in flights %}
<tr>
<td>{{ flight.airline }}</td>
<td>{{ flight.origin }}</td>
<td>{{ flight.destination }}</td>
<td>{{ flight.dateFrom }}</td>
<td>{{ flight.timeFrom }}</td>
<td>{{ flight.dateTo }}</td>
<td>{{ flight.timeTo }}</td>
</tr>
{% endfor %}

但我得到一个丑陋、神秘的异常,告诉我 “Proxies\FlightcaseBookingBundleEntityAirlineProxy 类的对象无法转换为字符串”,这让我相信我需要获取 Airline 对象中的特定属性例如要输出为字符串的 IATA 代码。但是如何访问 Twig 模板中的 $airline->getIataCode() 呢?或者我的存储库中有没有办法将相关对象转换为字符串?

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    我假设 Airline 是一个独立的实体,它与 Doctrine 中的 Flight 实体有关联。比如:

    class Airline
    {
        private $id;
        private $name;
        private $flights;
        ...
    }
    

    正确吗?如果是这样,那么这就是您看到该特定错误的原因。你给 Twig 一个对象,并告诉它打印出来……但这到底是什么意思?

    让我们假设您的班级看起来像上面那样,并且您只是想打印出航空公司的名称。

    你可以做以下两件事之一:

    首先,你可以给你的对象一个 toString() 方法:

    class Airline
        {
            public function toString()
            {
                return $this->getName();
            }
        }
    

    或者,您可以为 Twig 提供一些标量来使用:将 {{ flight.airline }} 替换为 {{ flight.airline.name }}

    编辑:

    刚刚看到您的 Airline 对象有一个名为 $IataCode 的属性。在这种情况下,您可以使用 {{ flight.airline.IataCode }} 在 Twig 中渲染它。

    【讨论】:

    • 实际上,Twig 会进行一系列检查,以尝试找出当你给它一个变量时它需要打印出什么。在此处查看文档中的“实施”部分:twig.sensiolabs.org/doc/templates.html#variables
    • 谢谢!事实上,我可以简单地使用 {{ flight.airline.IataCode }} 访问航空公司对象的属性。看起来很简单,但我还没有真正切换到 ORM 的思维方式。
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2012-05-20
    • 2012-01-09
    • 1970-01-01
    • 2021-12-11
    • 2014-10-11
    相关资源
    最近更新 更多