如何在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 :(得分: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,让它加载没有前缀的相应类。
这两种方法都存在问题,因为各种模块中的类名之间可能存在冲突。