【问题标题】:Adding a callback when reading from an object in Twig从 Twig 中的对象读取时添加回调
【发布时间】:2015-06-08 15:23:38
【问题描述】:

假设我有一个名为Entity 的基本实体,它映射到一个数据库表。该实体有两个属性:propertyApropertyB

这个实体的一个特殊之处是,尽管我们可以在这些属性中存储我们想要的任何内容,但是当在带有entity.propertyB 的 Twig 模板上使用 propertyB 的值时,我们希望系统地将值截断为 100 个字符。

现在,这在几个方面完全可行:

  • 直接在getPropertyB()方法中截断值;
  • 注册 Twig 扩展并创建专用过滤器;
  • 在实体上添加生命周期回调,以在实际创建对象之前截断值。

由于这是严格的显示规则,而不是我们实体的业务规则,所以第二种解决方案似乎是最好的恕我直言。但是,它要求我们每次需要在模板中使用 propertyB 的值时应用过滤器。如果有不知情的开发人员经过,该值可能不会被截断。

所以我的问题是:有没有办法注册某种回调,严格限制在包装我们实体的视图模型中,这将允许我们在其某些属性上即时应用一些过滤器?

【问题讨论】:

  • 为什么不在getPropertyBView()Entity 类中添加一个返回截断字符串的函数,您也可以添加一个仅返回标准getter 的getProportyAView(),这样新开发者将只能看到在 twig 中获取视图函数,并且只会复制他们看到的内容?
  • 这可能是一个想法,但我在这里看到两个缺点:首先,它会使用特定于事物视图方面的代码污染模型;然后它不会阻止其他开发人员使用原始方法。另外,为了给你一些背景信息,想象一下这个实体当前在多个模板中使用。这将需要手动将每次调用更改为 entity.propertyB entity.propertyBView
  • 除了您的第三个选项之外,您还可以有一个属性说title 和另一个属性title_short。第一个应该绑定到数据库表字段,其他的值将在生命周期回调中分配。然而,这仍然需要开发人员知道调用哪个:-/它仍然会污染你的模型,如你上面描述的......
  • 是的,这实际上是我迄今为止一直在使用的解决方案,但就像你说的那样,它仍然会引发一些问题。

标签: symfony twig


【解决方案1】:

由于您永远不需要访问超过 100 个字符的任何内容,因此您可以在其 setter 中截断该属性。这并没有真正污染实体代码,因为这是它固有的一些逻辑。

【讨论】:

  • 其实我猜是这样。如果我使用截断的字符串作为属性构建我的实体,我最终可能会使用截断的版本将其持久化回数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2012-12-21
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多