Plone getToolByName()与其他

Plone getToolByName()与其他,plone,Plone,访问Plone持久性实用程序的推荐方法是什么?为什么 getToolByName(上下文,“门户url”) 直接获取:context.portal\u url ITools接口 等等。使用ITools实用程序必须是最好的方法,因为它们是缓存的。然而,这有时会给我带来问题(与portal_成员身份工具有关,但我不记得细节),所以在极少数情况下,我会切换到getToolByName。 最后一个是直接获取。我认为答案在于getToolByName本身的代码()。该方法的作用是: 作为第一次尝试,

访问Plone持久性实用程序的推荐方法是什么?为什么

  • getToolByName(上下文,“门户url”)

  • 直接获取:context.portal\u url

  • ITools接口


等等。

使用ITools实用程序必须是最好的方法,因为它们是缓存的。然而,这有时会给我带来问题(与portal_成员身份工具有关,但我不记得细节),所以在极少数情况下,我会切换到getToolByName。
最后一个是直接获取。

我认为答案在于
getToolByName
本身的代码()。该方法的作用是:

  • 作为第一次尝试,它试图通过使用
    getUtility
    查找接口并将其包含在上下文中来获得所需的工具(这对我来说似乎是件好事)
  • 作为回退,它尝试直接从源上下文获取工具
因此,唯一的“将它们全部规则化”的方法似乎是:
getToolByName
但是,正如@keul所说,还涉及到缓存,看这里()很明显,使用ITools接口,当它没有因为工具尚未实现该接口而失败时,速度会更快

基于上述原因,最后我建议:

  • ITools(更快)
  • getToolByName(更安全)

  • (因为直接获取已经被GETToBBYNAMY尝试过,如果失败了,就不会有更多的财富)

    和最后的PLON.API方法-我仍然认为PLONE.API有一个小实验,因此不推荐…另外,我想知道答案背后的细节,因为
    getToolByName
    是CMFCore包中的一个方法,而
    ITool
    plone.app.layout
    中的一个接口。正如其域名所指出的,p.a.layout是一个更高级别的软件包,它是特定于Plone的。