Symfony 从细枝中的对象读取时添加回调

Symfony 从细枝中的对象读取时添加回调,symfony,twig,Symfony,Twig,假设我有一个名为entity的基本实体,它映射到一个数据库表。此实体有两个属性:propertyA和propertyB 该实体的一个特殊性是,尽管我们可以在这些属性中存储我们想要的任何内容,但当在带有实体的细枝模板上使用propertyB的值时,我们希望系统地将该值截断为100个字符 现在,这在几个方面是完全可行的: 在getPropertyB()方法中直接截断该值 注册细枝扩展并创建专用过滤器 在实体上添加生命周期回调以在实际创建对象之前截断值 由于这是严格的显示规则,而不是实体的业务规则

假设我有一个名为
entity
的基本实体,它映射到一个数据库表。此实体有两个属性:
propertyA
propertyB

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

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

  • getPropertyB()
    方法中直接截断该值
  • 注册细枝扩展并创建专用过滤器
  • 在实体上添加生命周期回调以在实际创建对象之前截断值
由于这是严格的显示规则,而不是实体的业务规则,第二种解决方案似乎是最好的IMHO。但是,它要求我们在每次需要在模板中使用
propertyB
的值时应用过滤器。如果有不知情的开发人员出现,则该值可能不会被截断


因此,我的问题是:有没有一种方法可以注册某种回调,严格限制在包装实体的视图模型中,从而允许我们对其某些属性动态应用一些过滤器?

因为您不需要访问超过100个字符的内容,所以可以在其setter中截断该属性。这实际上不会污染实体代码,因为这是它固有的一些逻辑。

为什么不在
getPropertyView()
Entity
类中添加一个返回截断字符串的函数,您还可以添加一个
getProportyAView()
这只是返回标准getter,因此新开发人员只会在twig中看到get view函数,而只会复制他们看到的内容?这可能是一个想法,但我在这里看到两个缺点:首先,它用特定于事物视图端的代码污染模型;然后,它不会阻止其他开发人员使用原始方法。另外,为了给您一点上下文,假设这个实体当前在多个模板中使用。这需要通过
实体.propertyView
手动更改对
实体.propertyB
的每次调用。除了第三个选项外,您还可以有一个属性,比如
title
,另一个属性
title\u short
。第一个应绑定到数据库表字段,另一个的值将在生命周期回调中分配。然而,这仍然需要开发人员知道调用哪一个:-/并且它仍然像您上面描述的那样处理您的模型…是的,这实际上是我到目前为止一直在使用的解决方案,但是正如您所说的,它仍然会引起一些问题。实际上,我想这有点像。如果我用一个截断的字符串作为属性构建实体,那么最终可能会用截断的版本将其持久化回数据库。