alphalemon/alphalemon-bootstrap-bundle

AlphaLemonBootstrapBundle 负责在基于 Composer 的应用程序上自动加载和配置组件。配置组件的责任委托给了组件的作者,该作者实现了一个 autoloader.json 文件,其中声明了组件的配置。

安装量: 1,970

依赖项: 1

建议者: 0

安全: 0

星标: 3

关注者: 3

分支: 0

开放问题: 0

类型:symfony-bundle

dev-rev-process 2012-08-03 16:17 UTC

This package is not auto-updated.

Last update: 2024-09-28 13:11:58 UTC


README

AlphaLemonBootstrapBundle 负责在基于 Composer 的应用程序上自动加载和配置组件。每个开发者都可以向组件添加 autoloader.json 文件并配置自动加载该组件,而无需在 AppKernel 文件中手动启用它。

Build Status

安装 AlphaLemonBootstrapBundle

要安装 AlphaLemonBootstrapBundle,只需在 composer.json 中要求它

"require": {
    [...]
    "alphalemon/alphalemon-bootstrap-bundle": "dev-master"
}

然后安装/更新包

php composer.phar install/update

最后必须将组件添加到 AppKernel.php 文件中

public function registerBundles()
{
    $bundles = array(
        new AlphaLemon\BootstrapBundle\AlphaLemonBootstrapBundle(),

        [...]
    );
}

autoload.json 文件

autoload.json 文件必须放置在要自动加载的组件根目录下。它由以下部分组成

  • bundles(必填)
  • actionManager
  • routing

必填的 bundles 部分包含您想要自动加载的组件。让我们看看一个非常基本的例子

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : ""
    }
}

这将为所有环境自动加载 BusinessDropCapBundle。

环境

有时,可能需要为某些环境自动加载组件,因此可以为组件添加简单的配置,如下所示

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
            "environments" : ["dev", "test"]
        }
    }
}

环境 选项仅使组件在指定的环境中可用。在上面的例子中,BusinessDropCapBundle 仅在 dev 和 test 环境中可用。

all 关键字

要指定所有环境,可以使用 all 关键字

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
            "environments" : ["all"]
        }
    }
}

此示例与第一个示例等效。

overrides 选项

有时可能发生一个组件覆盖了另一个组件的部分。在这种情况下,覆盖组件必须在被覆盖组件之后声明。可以使用 overrides 选项来实现此任务

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
            "environments" : ["dev", "test"],
            "overrides" : ["BusinessCarouselBundle"]
        }
    }
}

组件顺序将根据实例化 BusinessCarouselBundle 而不是 BusinessDropCapBundle 来解决

没有 autoloader.json 文件的组件自动加载

您可能想知道为什么我们谈论的是 "组件" 而不是 "组件"。这很简单解释,实际上您可以在没有 autoloader.json 文件的情况下自动加载组件。

假设 BusinessCarouselBundle 没有autoloader.json 文件,而 BusinessDropCapBundle 需要它。您可以按照以下方式编写 BusinessDropCapBundle 的自动加载器以自动加载它

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
			"environments" : ["dev", "test"]
		},
		"AlphaLemon\\Block\\BusinessCarouselBundle\\BusinessCarouselBundle" : ""
    }
}

如果您需要为特定环境启用它,只需如上所述添加 环境 选项即可。

在包安装或卸载时执行操作

当您需要在包安装或卸载后执行一些操作时,您必须添加一个扩展 ActionManager 对象并实现 ActionManagerInterface 的类。最后一个需要四个方法,它们是

packageInstalledPreBoot
packageUninstalledPreBoot
packageInstalledPostBoot
packageUninstalledPostBoot

ActionManager 类实现了所有这些方法作为空白方法,因为它们总是执行,所以您要做的只是扩展 ActionManager 对象并覆盖您需要的方法。

让我们详细看看这些动作。最需要注意的一点是动作执行的时间:有两个动作以 PreBoot 结尾,另外两个动作以 PostBoot 结尾。这种差异非常重要,实际上,前两个动作在内核未启动时执行,后两个动作在内核启动后执行,并且它们还接收容器。

要在您的 autoloader.json 文件中声明您的 ActionManager 类,您只需将此类指定给 actionManager 部分,如下所示

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : ""
    },
    "actionManager" : "\\AlphaLemon\\Block\\BusinessCarouselBundle\\Core\\\\ActionManager\\ActionManagerBusinessDropCap"
}

配置文件

通常,每个包都需要在应用程序的 config.yml 中添加一些配置才能正常工作。其中一些设置可能是通用的,例如启用包使用 assetic,而其他设置可能是特定于使用该包的应用程序。

BootstrapBundle 允许开发者直接通过包定义通用设置。这将为最终用户带来一些好处。

  • 仅需要通用设置的包可以不修改应用程序的 config.yml 文件即可使用。
  • 当包被许多应用程序使用时,通用配置已经完成。
  • 用户不再感到沮丧。
  • 对于需要编写较少文档的包的开发者来说,不再感到沮丧。
  • 轻量级的 config.yml 文件

要将通常放入应用程序的 config.yml 文件的配置添加进来,只需在包的 Resources/config 文件夹下添加一个 config.yml 文件,并将所需的设置添加到其中。BootstrapBundle 会负责将其复制到 app/config/bundles/[环境] 文件夹,并在 AppKernel 类中加载。

相同的原理也适用于包实现的路由,因此您可以在包的 Resources/config 中添加一个 routing.yml 文件,BootstrapBundle 会为您完成剩余的工作。

路由优先级

有时,一个路由文件必须在另一个包的路由文件之后处理。为了帮助完成这项任务,您可以在 autoloader.json 文件中添加一个 routing 选项,如下所示

{
    "bundles" : {
        "AlphaLemon\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : ""
    },
    "routing" : {
        "priority" : "128"
    }
}

当未指定选项时,每个包的路由优先级为零。要加载后面的路由文件,指定一个大于零的值,要加载前面的路由文件,指定一个小于零的值。

一个实际例子

例如,AlphaLemon CMS 使用 assetic 来管理其资产,因此希望使用该包的用户应在其应用程序的 config.yml 文件中添加以下配置

app/config/config.yml

assetic:
bundles: [AlphaLemonCmsBundle]
filters:
    cssrewrite: ~
    yui_css:
        jar: %kernel.root_dir%/Resources/java/yuicompressor.jar
    yui_js:
        jar: %kernel.root_dir%/Resources/java/yuicompressor.jar

使用 BootstrapBundle,这些设置已经添加到 AlphaLemonCms 包的 config.yml 文件中,因此用户已经有了通用配置,可以直接使用,无需在 config.yml 文件中添加任何内容。

启用路由自动加载

要启用路由自动加载,必须在 routing.yml 配置文件中添加以下配置

AlphaLemonBootstrapBundle:
    resource: .
    type: bootstrap

在 AppKernel 中使用 BootstrapBundle

为了启用自动加载,必须在 AppKernel 文件中做一些小的更改。在 registerBundles 方法的末尾,声明一个新的 BundlesAutoloader 对象,如下所示

public function registerBundles()
{
    [...]

    $bootstrapper = new \AlphaLemon\BootstrapBundle\Core\Autoloader\BundlesAutoloader(__DIR__, $this->getEnvironment(), $bundles);
    $bundles = $bootstrapper->getBundles();

    return $bundles;
}

该对象需要内核目录(AppKernel 所在的位置)、当前环境和实例化的包。然后通过 getBundles 方法检索包,并按常规返回。

要加载来自 app/config/bundles 文件夹的配置,必须更改 registerContainerConfiguration,如下所示

public function registerContainerConfiguration(LoaderInterface $loader)
{
    $configFolder = __DIR__ . '/config/bundles/config/' . $this->getEnvironment();
    $finder = new \Symfony\Component\Finder\Finder();
    $configFiles = $finder->depth(0)->name('*.yml')->in($configFolder);
    foreach ($configFiles as $config) {
        $loader->load((string)$config);
    };

    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}

这样就足以自动加载所有具有自动加载文件的包。