Symfony 继承对象的细枝实例

Symfony 继承对象的细枝实例,symfony,propel,twig,single-table-inheritance,Symfony,Propel,Twig,Single Table Inheritance,我正在使用propel的以下功能 我也在使用Symfony2和Twig 我有一个类结构,使用上面的特性,看起来像这样 class Event {} class Birthday extends Event {} class Walking extends Event {} 现在我将一个事件对象传递给一个细枝模板,我想知道它是什么类型的事件 例如,如果是生日,我想显示蛋糕的图像,如果是步行事件,我想显示地图路线 我无法在细枝中使用instanceof,因为此功能不存在。 现在有人知道为什么这

我正在使用propel的以下功能

我也在使用Symfony2和Twig

我有一个类结构,使用上面的特性,看起来像这样

class Event {}

class Birthday extends Event {}

class Walking extends Event {}
现在我将一个事件对象传递给一个细枝模板,我想知道它是什么类型的事件

例如,如果是生日,我想显示蛋糕的图像,如果是步行事件,我想显示地图路线

我无法在细枝中使用instanceof,因为此功能不存在。 现在有人知道为什么这不存在吗? 有没有一种方法我可以复制这个功能而不必做类似的事情

 public function getType()
在每个班级,或

 public function isBirthday()
在事件类中

我在github上找到了这个,但它对我没有用。我已经对他们的观点发表了评论,看看我是否能得到答案


从架构的角度来看,不赞成在模板中使用instanceof。如果您发现自己处于“需要”它的位置,那么您可能已经发现了体系结构中的一个问题。您的getType解决方案可能是最好的。您仍然可以将其放入事件基类中,并将其读出实现类的名称。

如果您知道每个继承的对象都有一个唯一的方法,则实现这一点的间接方法是测试对象的方法。也许你的生日班有一个GetBirth(),而步行班有一个getMap()


我同意这样的观点,
instanceof
不应该出现在模板中。我在这个案例中使用了细枝测试

class MyTwigExtension extends TwigExtension
{
    public function getTests ()
    {
        return [
            new \Twig_SimpleTest('birthday', function (Event $event) { return $event instanceof Birthday; }),
            new \Twig_SimpleTest('walking', function (Event $event) { return $event instanceof Walking; })
        ];
    }
}
在模板中

{% if event is birthday %}{# do something #}{% endif %}

我试图制作一个index.html.twig,列出用户定义的实体,并且只列出标记为
'addToListing'
的字段,因此我不知道打印的是什么

{% for entity in entities %}
    <tr>
        {% for heading in headings %}
            <td><a href="{{ path('document_show', { 'id': entity.id, docType: metaData.className }) }}">{{ attribute(entity, heading) }}</a></td>
        {% endfor %}
    </tr>
{% endfor %}
{%用于实体中的实体%}
{标题%中的标题为%}
{%endfor%}
{%endfor%}
标题正好是\DateTime:,所以在这种情况下,我需要| date('format')或更好的解决方案


有没有关于清洁解决方案的建议?

我也有类似的问题,这与酒店软件的继承有关。我有一个基类“RoomEquipment”,继承了“床”、“电器”

当然,一个班级的“房间”与“房间设备”有着千丝万缕的联系

在模板上,我只想渲染床,但房间和基本设备有关,包括床和电器

我没有在twig模板中进行测试,而是在Room类中创建了一个方法getBeds,就是这样

class Room {

  private $equipment;

  public getBeds() 
  {
     $res = [];
     foreach($this->getEquipment() as $eq) {
        if ($eq instanceof Bed) $res[] = $eq;
     }
     return $res;
  }

  // Rest of class here....

}
当然,在细枝上:

<div>
    {% for Bed in Room.beds %}
       {{ Bed.nbPersons }}
    {% endfor %}
</div>

{%用于房间中的床。床%}
{{Bed.nbPersons}
{%endfor%}
由于属性访问器组件,这是可能的。现在,您的细枝不必检查实例类型,也不必检查其他解决方案:

class Event {
    ...
    public function isInstanceOfBirthday() {
        return $this instanceof Birthday;
    }
}
然后它将与继承自的任何类一起工作

class Birthday extends Event {}

class Walking extends Event {}
然后在你的树枝上:

{{ event.isInstanceOfBirthday ? ... something for Birthday instance ... : ... something for Walking instance ... }}


没有神奇的
.method
getter通过细枝添加到每个对象。因此,只要
您的对象
实际上没有名为“method”的方法,您的表达式就永远不会为真。相反,只需使用
{%if yourObject.methodName被定义为%}
,其中“methodName”是您正在检查的函数的确切名称。对于那些想知道的人:这叫做“Duck Typing”:)我想我只是太密集了,但我似乎无法在@fabbot/Twig中的任何地方找到TwigTest类。您是否定义了一个扩展
\Twig\u Test
的自定义类,或者它是另一个类的别名<代码>\Twig_Test
本身是抽象的,因此不可读。找到它了。我猜这门课在过去六个月的某个时候被重新命名了
\Twig\u SimpleTest
替代上面的
TwigTest
。请参阅:@TwoWholeForms Nope,我只想导入它们,就像
use\Twig\u Test as TwigTest;//甚至“作为测试”
(它是从某处复制粘贴的)。更适合整体编码风格我不同意,如果我有所有相关项目,并且我想在同一页上列出它们或显示计数,为什么我要在我的控制器中进行过滤,并且在视图已经有了这些项并且只需要为了显示目的而进行分解时,我必须向视图传递更多的变量呢?上面的解决方案不是很好,因为它是一个日期时间,您知道它有->format方法等等。如果我理解你的例子,像
如果定义了entity.format
应该可以做到这一点!一、 我担心的是标题类型。我用一个包含的模板替换了innerHtml,该模板到目前为止看起来像:
{%if bridge.is_scalar(attribute(entity,heading))或attribute(entity,heading)。\u toString已定义或attribute(entity,heading)为null%}{{{attribute(entity,heading):'empty'}{%else%}{%if bridge get_class(attribute(entity,heading))=='DateTime%}{{{dump(bridge.get_class(attribute(entity,heading))}{{attribute(entity,heading){date(dateFormat)}{%else%}{%endif%}{%endif%}
这里是bridge:
名称空间DocDigital\Bundle\DocumentBundle\Helper;/***twig**@author Juan Manuel Fernandez*/class TwigPhpBridge{public function}调用($functionName,array$argV){return call_user_func_数组($functionName,$argV);}}
class Birthday extends Event {}

class Walking extends Event {}
{{ event.isInstanceOfBirthday ? ... something for Birthday instance ... : ... something for Walking instance ... }}
{% if event.isInstanceOfBirthday %}
    ... do something for Birthday instance ...
{% else %}
    ... do something for Walking instance ...
{% endif %}