【发布时间】:2015-06-08 15:23:38
【问题描述】:
假设我有一个名为Entity 的基本实体,它映射到一个数据库表。该实体有两个属性:propertyA 和 propertyB。
这个实体的一个特殊之处是,尽管我们可以在这些属性中存储我们想要的任何内容,但是当在带有entity.propertyB 的 Twig 模板上使用 propertyB 的值时,我们希望系统地将值截断为 100 个字符。
现在,这在几个方面完全可行:
- 直接在
getPropertyB()方法中截断值; - 注册 Twig 扩展并创建专用过滤器;
- 在实体上添加生命周期回调,以在实际创建对象之前截断值。
由于这是严格的显示规则,而不是我们实体的业务规则,所以第二种解决方案似乎是最好的恕我直言。但是,它要求我们每次需要在模板中使用 propertyB 的值时应用过滤器。如果有不知情的开发人员经过,该值可能不会被截断。
所以我的问题是:有没有办法注册某种回调,严格限制在包装我们实体的视图模型中,这将允许我们在其某些属性上即时应用一些过滤器?
【问题讨论】:
-
为什么不在
getPropertyBView()的Entity类中添加一个返回截断字符串的函数,您也可以添加一个仅返回标准getter 的getProportyAView(),这样新开发者将只能看到在 twig 中获取视图函数,并且只会复制他们看到的内容? -
这可能是一个想法,但我在这里看到两个缺点:首先,它会使用特定于事物视图方面的代码污染模型;然后它不会阻止其他开发人员使用原始方法。另外,为了给你一些背景信息,想象一下这个实体当前在多个模板中使用。这将需要手动将每次调用更改为
entity.propertyBentity.propertyBView。 -
除了您的第三个选项之外,您还可以有一个属性说
title和另一个属性title_short。第一个应该绑定到数据库表字段,其他的值将在生命周期回调中分配。然而,这仍然需要开发人员知道调用哪个:-/它仍然会污染你的模型,如你上面描述的...... -
是的,这实际上是我迄今为止一直在使用的解决方案,但就像你说的那样,它仍然会引发一些问题。