2011-12-12 198 views
0

我如何在我的Symfony 1.4項目中自動加載模塊的lib文件夾?可能你知道這個問題:Symfony 1.4:自動加載模塊的lib文件夾

如果我創建插件,我將模塊操作的基類存儲在lib文件夾中。存儲在actions/actions.class.php中的每個動作類都從該基類繼承。這使得覆蓋在項目級別的插件,操作:

myModule 
    actions 
     actions.class.php 
    lib 
     BasemyModuleActions.class.php 

但不幸的是,Symfony的不自動加載BasemyModuleActions,你必須手動包含相應的文件:

require_once(dirname(__FILE__) .'/lib/BasemyModuleActions.class.php'); 
class myModuleActions extends BasemyModuleActions 
{ 
} 

這工作,但它是真的很煩人。此外,我想在模塊的lib文件夾中放置更多文件,例如形式。

有沒有辦法將這些目錄添加到自動裝載機?

在相關模塊中存儲表單對我很有好處,因爲我只在少數情況下對不同的模塊重複使用相同的表單。

您的解決方案是否與Doctrine表單生成任務兼容?即Symfony是否意識到現有的表單,或者如果將其移出lib/form/doctrine,它會再次創建嗎? (沒問題,如果你不能回答這個問題,但如果你知道在這種情況下,一種解決方法,將是很好的。)

+0

據我所知應該自動加載。你清除了緩存嗎? – Maerlyn

+0

看看上面的例子。即使在sfDoctrineGuardPlugin的操作中,您也會發現'require_once'解決方法。我相信他們不是自動加載的。 – fishbone

回答

1

在本頁面看看:

http://www.symfony-project.org/reference/1_4/en/14-Other-Configuration-Files

它描述了一個自動加載.yml文件,該文件將symfony配置爲在不同目錄中查找類。

的Symfony不會自動加載我/apps/app_name/lib/*.*類,但這樣做有以下內容創建/config/autoload.yml文件後:

autoload: 
    # project 
    project: 
    name:   project 
    path:   %SF_LIB_DIR% 
    recursive:  true 
    exclude:  [model, symfony] 

    project_model: 
    name:   project model 
    path:   %SF_LIB_DIR%/model 
    recursive:  true 

    # application 
    application: 
    name:   application 
    path:   %SF_APP_LIB_DIR% 
    recursive:  true 

    modules: 
    name:   module 
    path:   %SF_APP_DIR%/modules/*/lib 
    prefix:   1 
    recursive:  true 

以上頁面描述爲默認配置。

+0

我會盡快嘗試,但目前我沒有太多時間。不過,我想知道這是如何工作的。正如你所說,它應該已經是默認配置。因此,添加autoload.yml應該沒有任何作用。 – fishbone

1

據我瞭解,這是自動裝載機和主控制器流程中的雞和雞蛋問題。

默認autoload.yml中的前綴:1表示如果在當前模塊中「in」,這些類只能用於自動加載。

當前模塊的確定方式是通過查看actionStack。

模塊/動作在檢查後會添加到actionStack中,看它是否存在。

不幸的是,以確定是否存在動作symfony的負載的actions.class.php

因此,你需要有明確的,require_once。

如果您刪除了前綴:1,並且您的模塊是您的應用程序的一部分(未從插件加載),您將不需要該需求一次。

如果該模塊是插件的一部分,則需要使用sfPluginConfiguration來加載沒有前綴的相應類。

這兩種方法都有問題,因爲各個模塊中的類名稱之間可能會發生衝突。