Symfony 继承对象的细枝实例
我正在使用propel的以下功能 我也在使用Symfony2和Twig 我有一个类结构,使用上面的特性,看起来像这样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,因为此功能不存在。 现在有人知道为什么这
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 %}