2011-12-12 187 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来加载没有前缀的相应类。

这两种方法都有问题,因为各个模块中的类名称之间可能会发生冲突。