redkite-labs / redkite-labs-bootstrap-bundle
RedKiteLabsBootstrapBundle 负责在基于 Composer 的应用程序中自动加载和配置组件。配置组件的责任委托给组件的作者,作者实现一个 autoloader.json 文件,其中声明组件的配置。
Requires
- php: >=5.3.3
Requires (Dev)
- doctrine/doctrine-bundle: 1.2.*
- doctrine/orm: >=2.2.3,<2.4-dev
- mikey179/vfsstream: 1.1.0
- sensio/distribution-bundle: 2.3.*
- sensio/framework-extra-bundle: 2.3.*
- sensio/generator-bundle: 2.3.*
- symfony/assetic-bundle: 2.3.*
- symfony/monolog-bundle: 2.3.*
- symfony/swiftmailer-bundle: 2.3.*
- symfony/symfony: 2.3.*
- twig/extensions: 1.0.*
README
RedKiteLabsBootstrapBundle 负责为 composer 管理依赖的应用程序自动加载和配置 Symfony2 组件。
要自动加载组件,无需在 Symfony2 的 AppKernel 中声明它,您只需在组件的顶级文件夹中创建一个 autoloader.json 文件,然后让 RedKiteLabsBootstrapBundle 为您完成繁重的工作。
您可以根据环境自动加载组件,并且可以在组件本身附带的 config.yml 文件中添加基本配置,以定义用户应手动添加到应用程序的 config.yml 文件中的基本配置。
至于配置,您可以在 routing.yml 文件中定义路由,并随组件一起分发。
安装 RedKiteLabsBootstrapBundle
要安装 RedKiteLabsBootstrapBundle,只需在 composer.json 中添加它。
"require": {
[...]
"redkite-labs/bootbusiness-theme-bundle": "dev-master"
}
然后安装/更新包
php composer.phar install/update
最后,必须在 AppKernel.php 文件中添加组件。
public function registerBundles()
{
$bundles = array(
new RedKiteLabs\RedKiteCms\BootstrapBundle\RedKiteLabsBootstrapBundle(),
[...]
);
}
autoload.json 文件
autoload.json 文件必须放在组件的顶级文件夹中,其结构如下
- bundles (必需)
- routing
必需的 bundles 部分包含您希望自动加载的组件。让我们看看一个非常基础的例子
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : ""
}
}
这将自动加载整个应用程序环境的 BusinessDropCapBundle。
环境
当您只需要为某些环境自动加载组件时,只需在组件中添加 environments 选项。
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
"environments" : ["dev", "test"]
}
}
}
environments 选项仅启用声明的环境。在上面的例子中,BusinessDropCapBundle 仅在开发和测试环境中启用。
all 关键字
要指定所有环境,可以使用 all 关键字
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
"environments" : ["all"]
}
}
}
这是库在未定义 environments 选项时的默认选项。
overrides 选项
当一个组件覆盖另一个组件时,必须在 AppKernel 中在覆盖的组件之后实例化该组件。
您可以在 autoload.json 中添加 overrides 选项来实现这种情况
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
"environments" : ["dev", "test"],
"overrides" : ["BusinessCarouselBundle"]
}
}
}
在这个例子中,组件的顺序将是通过先实例化 BusinessCarouselBundle 然后是 BusinessDropCapBundle 来解决的
不使用 autoloader.json 文件自动加载组件
您可能想知道为什么我们谈论的是 "组件" 而不是 "组件"。这很简单解释,事实上您可以在组件不实现 autoloader.json 文件的情况下自动加载组件。
假设 BusinessCarouselBundle 没有autoloader.json 文件,而 BusinessDropCapBundle 需要它。您可以像下面这样编写 BusinessDropCapBundle 的自动加载以自动加载它
例如,假设 BusinessCarouselBundle 需要 PropelBundle 来工作,而这个最后的包不实现 autoloader.json 文件。
在这种情况下,您可以轻松地通过在 autoload.json 文件中声明该包来自动加载 PropelBundle
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : {
"environments" : ["dev", "test"]
},
"RedKiteLabs\\Block\\BusinessCarouselBundle\\BusinessCarouselBundle" : ""
}
}
如果您需要为特定环境启用它,您只需按照上述方法添加 environments 选项即可。
另一种情况可能是当一个包实现自己的环境时。例如,RedKiteCmsBundle 实现了 rkcms 和 rkcms_dev 环境,因此我们需要注册许多第三方包。
{
"bundles" : {
"RedKiteLabs\\RedKiteCmsBundle\\RedKiteCmsBundle" : {
"environments" : ["rkcms", "rkcms_dev", "rkcms_test", "test"]
},
"Propel\\PropelBundle\\PropelBundle" : {
"environments" : ["rkcms", "rkcms_dev", "rkcms_test", "test"]
},
"Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle" : {
"environments" : ["rkcms_dev", "rkcms_test"]
},
"Sensio\\Bundle\\DistributionBundle\\SensioDistributionBundle" : {
"environments" : ["rkcms_dev", "rkcms_test"]
},
"Sensio\\Bundle\\GeneratorBundle\\SensioGeneratorBundle" : {
"environments" : ["rkcms", "rkcms_dev", "rkcms_test"]
}
}
}
"RedKiteLabs\RedKiteCmsBundle\RedKiteCmsBundle" 部分启用了 RedKiteCmsBundle 在 "rkcms", "rkcms_dev", "rkcms_test", "test" 环境中,然后需要 PropelBundle 在相同环境中,最后需要 WebProfilerBundle、SensioDistributionBundle 和 SensioGeneratorBundle 在 "rkcms_dev", "rkcms_test" 环境中。
配置文件(config.yml - routing.yml)
通常每个包都需要在应用的 config.yml 中添加一些配置以使其正常工作。其中一些设置可能是通用的,例如启用包使用 assetic,而其他设置可能针对使用该包的应用是特定的。
BootstrapBundle 允许开发者直接使用包来定义通用设置,这对最终用户将产生一些好处。
- 只需要通用设置的包可以在不修改应用的 config.yml 文件的情况下使用。
- 当包被许多应用使用时,通用配置已经完成。
- 用户的不满减少
- 需要编写较少文档的包的开发者不满减少
- 轻量级的 config.yml 文件
要将通常放入应用 config.yml 文件的配置添加进去,只需在您的包的 Resources/config 文件夹下添加一个 config.yml 文件,并将所需的设置添加到其中。
BootstrapBundle 会负责将其复制到 app/config/bundles/[环境] 文件夹中,并在 AppKernel 类中加载您的配置。
相同的概念也应用于由包实现的路由,因此您可以在您的包的 Resources/config 中添加一个 routing.yml 文件,BootstrapBundle 将为您完成剩余的工作。
路由优先级
当您需要为路由文件分配特定优先级时,您可以在配置文件中添加一个 routing/priority 设置。
{
"bundles" : {
"RedKiteLabs\\Block\\BusinessDropCapBundle\\BusinessDropCapBundle" : ""
},
"routing" : {
"priority" : "128"
}
}
如果未指定选项,每个包的默认路由优先级为零。要加载路由文件后的文件,指定一个大于零的值;要加载路由文件之前的文件,指定一个小于零的值。
一个实际例子
例如,RedKiteCmsBundle 使用 assetic 来管理其资产,因此想要使用该包的用户应该将其应用的 config.yml 文件中添加以下配置
app/config/config.yml
assetic:
bundles: [RedKiteLabsCmsBundle]
filters:
cssrewrite: ~
yui_css:
jar: %kernel.root_dir%/Resources/java/yuicompressor.jar
yui_js:
jar: %kernel.root_dir%/Resources/java/yuicompressor.jar
使用 BootstrapBundle,这些设置已经添加到 RedKiteCmsBundle 的 config.yml 文件中,因此用户不需要手动将这些设置添加到应用的 config.yml 中。
启用路由自动加载
要启用路由自动加载,必须在应用的 routing.yml 配置文件中添加以下配置
RedKiteLabsBootstrapBundle:
resource: .
type: bootstrap
在 AppKernel 中使用 BootstrapBundle
为了启用自动加载,必须在 AppKernel 文件中实施一些小的更改。在 registerBundles 方法的末尾,声明一个新的 BundlesAutoloader 对象,如下所示
public function registerBundles()
{
$bundles = array(
[...]
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
[...]
}
$bootstrapper = new \RedKiteLabs\RedKiteCms\BootstrapBundle\Core\Autoloader\BundlesAutoloader(__DIR__, $this->getEnvironment(), $bundles);
$bundles = $bootstrapper->getBundles();
return $bundles;
}
BundlesAutoloader 需要第一个参数为 kernel dir,即 AppKernel 放置的位置,第二个参数为当前环境,第三个参数为实例化的包。
通过 getBundles 方法检索包,并按常规返回。
要从 app/config/bundles 文件夹加载配置,必须将默认的 registerContainerConfiguration 改为如下所示
public function registerContainerConfiguration(LoaderInterface $loader)
{
$configFolder = __DIR__ . '/config/bundles/config/' . $this->getEnvironment();
if (is_dir($configFolder)) {
$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');
}
从其他文件夹自动加载包
BundlesAutoloader 可以配置为在您的应用的其他文件夹中查找自动加载的包。
默认情况下,BundlesAutoloader 会查找 src/RedKiteCms/Block 和 src/RedKiteCms/Theme 文件夹。
您可以轻松地更改该参数,通过将定义了文件夹的数组传递给BundlesAutoloader声明。
例如,如果您需要告诉BundlesAutoloader在src/Acme中查找,只需按以下方式更改BundlesAutoloader的实例化
$bootstrapper = new \RedKiteLabs\BootstrapBundle\Core\Autoloader\BundlesAutoloader(__DIR__, $this->getEnvironment(), $bundles, array(__DIR__ . '/../src/Acme');
请注意,BundlesAutoloader假定您的bundle被放置在Acme文件夹内。