alphalemon / alphalemon-bootstrap-bundle
AlphaLemonBootstrapBundle 负责在基于 Composer 的应用程序上自动加载和配置组件。配置组件的责任委托给了组件的作者,该作者实现了一个 autoloader.json 文件,其中声明了组件的配置。
Requires
- php: >=5.3.3
- jms/di-extra-bundle: 1.0.*
- jms/security-extra-bundle: 1.1.*
- mikey179/vfsstream: dev-master
- sensio/distribution-bundle: dev-master
- sensio/framework-extra-bundle: dev-master
- sensio/generator-bundle: dev-master
- symfony/monolog-bundle: dev-master
- symfony/swiftmailer-bundle: dev-master
- symfony/symfony: dev-master
- twig/extensions: dev-master
This package is not auto-updated.
Last update: 2024-09-28 13:11:58 UTC
README
AlphaLemonBootstrapBundle 负责在基于 Composer 的应用程序上自动加载和配置组件。每个开发者都可以向组件添加 autoloader.json 文件并配置自动加载该组件,而无需在 AppKernel 文件中手动启用它。
安装 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');
}
这样就足以自动加载所有具有自动加载文件的包。