adrenalinkin / config-helper
扩展 Symfony 依赖注入组件,并允许通过通用的 YAML 文件在各个包中分别存储配置
Requires
- php: ~5.4||~7.0
- symfony/config: ~2.5||~3.0||~4.0
- symfony/dependency-injection: ~2.5||~3.0||~4.0
- symfony/finder: ~2.5||~3.0||~4.0
- symfony/yaml: ~2.3.42||~2.7.14||~2.8.7||~3.0||~4.0
Suggests
- symfony/symfony: Allows more advanced functionality with full Symfony package
README
简介
组件允许扩展标准类 Symfony\Component\DependencyInjection\Extension\Extension
并打开在所有注册的包中收集 YAML
配置的可能性。
安装
打开命令控制台,进入您的项目目录,并执行以下命令以下载此组件的最新稳定版本
composer require adrenalinkin/config-helper
此命令要求您全局安装 Composer。
使用示例和与标准方法的比较
假设我们的项目中包含两个包。包包含两个独立系统部分的业务逻辑
AcmeBundle
包含实体AcmeBundle:User
和AcmeBundle:Position
AcmePostBundle
包含实体AcmePostBundle:Post
想象一下,您需要为每个实体添加配置。假设我们需要配置来决定用户系统角色以便访问特定功能。为此,已创建包 AcmeConfigBundle
。配置示例
acme_config: AcmeBundle:User: ROLE_USER_ADMIN # key - name of the entity; value - role AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN
标准方法
我们可以将配置放入全局配置文件 app/config/config.yml
# app/config/config.yml # other bundle's configurations acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN # other bundle's configurations
我们还可以将配置放入 AcmeConfigBundle
包下的特定配置文件,并从 AcmeConfigExtension
加载
#Acme/ConfigBundle/Resources/config/custom.yml acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN
然而,这两种方法,对于我们的实现,有一个缺点。每次我们创建新的包时,我们都将需要修改全局配置文件或 AcmeConfigBundle
中的配置文件。**这两种情况都会在项目的各个部分之间产生硬链接**
组件使用
为了防止项目各部分之间的硬链接,您需要
- 为配置存储选择文件名,例如
acme_config.yml
。 - 从 AbstractExtension 扩展
AcmeConfigExtension
<?php namespace Acme\Bundle\ConfigBundle\DependencyInjection; use Linkin\Component\ConfigHelper\Extension\AbstractExtension; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader; class AcmeConfigExtension extends AbstractExtension { /** * {@inheritdoc} */ public function getAlias() { return 'acme_config'; } /** * {@inheritdoc} */ public function load(array $configs, ContainerBuilder $container) { // load all configurations from the all registered bundles $configs = $this->getConfigurationsFromFile('acme_config.yml', $container); // process received configuration $configs = $this->processConfiguration(new Configuration(), $configs); // some actions $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); } }
- 按包创建配置文件
# Acme/AcmeBundle/Resources/config/acme_config.yml acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN
# AcmePost/AcmePostBundle/Resources/config/acme_config.yml acme_config: AcmePostBundle:Post: ROLE_POST_ADMIN
此方法允许您在不进行项目全局更改的情况下创建和删除包中的配置。您可以在需要的包中删除某些配置,甚至删除整个包(例如 AcmePostBundle
)。
注意:默认情况下,方法 getConfigurationsFromFile($fileName, ContainerBuilder $container, $merge = true)
使用标准的 PHP 函数 array_merge_recursive 合并所有找到的配置。如果您想自己准备配置,请将第三个参数设为 false
并接收所有注册配置的堆栈。