render() 和 renderStatic() 之间有什么区别以及在 TYPO3 中编写 ViewHelper 时应该使用什么

What is the difference between render() and renderStatic() and what should be used when writing a ViewHelper in TYPO3

有几个编写自定义 ViewHelper 的示例和不同的操作方法。我见过使用 render() 和使用 renderStatic 的示例(例如 Developing a Custom ViewHelper)。

24 Fluid Tips中有解释,但我不明白,也不清楚为什么有2个函数以及应该在哪里使用。

重大更改(不推荐使用 ViewHelpers 上的 Render 方法参数)和各个地方的零散信息使得这里很难得到明确的答案。 Developing a Custom ViewHelper 中的示例是最新的和最佳实践吗?

renderStatic()
首先,renderStatic()是一个staticPHP方法。这意味着,您无权访问实例属性,例如 $this->tag,例如,当您的 ViewHelper class 是 AbstractTagBasedViewHelper 的子 class 时,这是必需的。

renderStatic()的另一个缺点是不能访问子节点。例如下例中的子节点是<f:then>

<f:if condition="{variable}">
<f:then>
...
</f:then>
</f:if>

话虽如此,renderStatic() 具有最佳性能,因为它是从已编译的 Fluid 中调用的。因此,如果可能的话,应该使用这种方法。

render()
在某些情况下,此方法是更好的选择或必须用于特定用例(参见上面的解释)。 render() 方法中实现的逻辑未编译,这对缓存的输出有影响。

render() 的缺点是它的性能。

总结/补充说明

  • 如果可以(性能),请使用 renderStatic()
  • 使用 render(),如果您实施 TagBased-ViewHelper(子class of
    TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper).
  • 如果需要读取子节点,使用render()
  • 查看 Fluid 附带的 ViewHelper(例如 TYPO3 v9 LTS)作为示例。
    (参见:typo3/sysext/fluid/Classes/ViewHelpers/*)[GitHub]