Symfony 1.4:自动加载模块的lib文件夹

时间:2011-12-12 13:59:00

标签: php symfony1 doctrine symfony-1.4 autoload

如何在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,是否会再次创建? (没问题,如果你不能回答这个问题。但如果你知道这种情况下的解决方法会很好)

2 个答案:

答案 0 :(得分:1)

看看这个页面:

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

它描述了一个autoload.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

上面的页面描述为默认配置。

答案 1 :(得分:1)

据我所知,这是自动加载器和主控制器流程中的鸡和蛋问题。

默认的autoload.yml中的前缀:1表示这些类只有在' in'中才能自动加载。目前的模块。

确定当前模块的方式是查看actionStack。

在检查是否存在后,将模块/操作添加到actionStack中。

不幸的是,确定一个动作是否存在symfony加载actions.class.php

因此,您需要具有显式的require_once。

如果你摆脱了前缀:1并且你的模块是你的应用程序的一部分(不是从插件加载),你将不需要一次。

如果模块是插件的一部分,你需要搞乱sfPluginConfiguration,让它加载没有前缀的相应类。

这两种方法都存在问题,因为各种模块中的类名之间可能存在冲突。

相关问题