2012-03-19 60 views
6

訪問Plone持久工具的推薦方法是什麼?爲什麼?getToolByName()與其他人

  • getToolByName(上下文中, 「portal_url」)

  • 直接採集:context.portal_url

  • ITOOLS接口

+1

而最後的plone.api方法 - http://readthedocs.org/docs/ploneapi/en/latest/utilities.html#get-tool – 2012-03-19 07:37:44

+2

我仍然考慮plon e.api有點experimetanl,因此不建議......我也想知道答案背後的見解 – 2012-03-19 08:01:03

回答

5

我認爲答案是在getToolByName本身的代碼(http://svn.zope.org/Products.CMFCore/trunk/Products/CMFCore/utils.py?view=markup)。該方法做到這一點:

  • ,因爲它試圖第一次嘗試通過查找與getUtility接口和包括它在上下文(這似乎是一件好事我)
  • 作爲以獲得所需的工具回退到它試圖直接獲取來自源上下文工具

所以,唯一的方法「來統治他們」似乎是:getToolByName 但是,正如@keul說,有也參與了緩存,並期待在這裏(http://collective-docs.readthedocs.org/en/latest/misc/context.html#itools-interface)很明顯,使用ITools接口時不會由於尚未實現該接口的工具而失敗,因此速度更快。

基於上述原因,到底我建議:

  1. ITOOLS(快)
  2. getToolByName(更安全)

(如直接收購已經通過嘗試getToolByName,如果失敗,你不會有更多的財富)

+1

我想知道爲什麼getToolByName不首先查詢ITools。 – 2012-03-29 11:52:41

+0

,因爲'getToolByName'是CMFCore包中的一個方法,而'ITool'是'plone.app.layout'中的一個接口。正如其域名所指出的那樣,p.a.layout是一個更高層次的包,並且它是Plone特有的。 – 2012-03-29 16:28:46

2

使用ITOOLS的公用事業必須是最好的方法,因爲它們被緩存。然而,這有時會給我帶來問題(與portal_membership工具有關,但我不記得細節),所以在極少數情況下,我切換到getToolByName。 最後一個是直接收購。