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]
有几个编写自定义 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]