【问题标题】:Symfony 1.4: autoload modules' lib foldersSymfony 1.4:自动加载模块的 lib 文件夹
【发布时间】:2012-01-18 12:19:02
【问题描述】:

如何在 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 表单生成任务兼容? IE。 Symfony 是否知道现有表单,或者如果将其移出lib/form/doctrine 是否会再次创建它? (没问题,如果你不能回答这个问题。但如果你知道这种情况下的解决方法会很好)

【问题讨论】:

  • 据我所知应该是自动加载的。你清除缓存了吗?
  • 看上面的例子。即使在 sfDoctrineGuardPlugin 的操作中,您也会发现 require_once 解决方法。我确定它们没有自动加载。

标签: php symfony1 doctrine symfony-1.4 autoload


【解决方案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

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

【讨论】:

  • 我会尽快尝试,但目前我没有太多时间。但是我想知道这怎么可能。正如您所说,它应该已经是默认配置。因此,添加 autoload.yml 应该没有任何效果。
【解决方案2】:

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

默认 autoload.yml 中的前缀 1 表示这些类仅在“在”当前模块中时才可用于自动加载。

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

模块/动作在检查是否存在后被添加到actionStack中。

不幸的是判断一个动作是否存在 symfony 加载了actions.class.php

因此你需要有明确的 require_once。

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

如果模块是插件的一部分,你需要弄乱 sfPluginConfiguration 让它加载不带前缀的适当类。

这两种方法都有问题,因为不同模块中的类名可能会发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2011-03-22
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多