wemakecustom / directory-loader-bundle
Symfony DirectoryLoaderBundle 递归导入配置目录
Requires
- php: >=5.3.2
Suggests
- symfony/dependency-injection: Compatible with DI configuration files
- symfony/framework-bundle: Register the loaders inside Symfony
- symfony/routing: Compatible with routing configuration files
- wemakecustom/composer-script-utils: Interactively configure missing parameters recursively
This package is not auto-updated.
Last update: 2022-07-18 08:52:36 UTC
README
递归导入配置目录。
这对主配置文件和路由器都适用。
详见 https://github.com/symfony/symfony-standard/issues/599
自 symfony/symfony#14700 合并(Symfony 2.8+)以来,目录加载器默认包含在 Symfony 中。然而,为了参考,文档仍保留在此。
有关 DirectoryLoader 的更多使用案例,请参阅 https://symfony.ac.cn/doc/current/cookbook/configuration/configuration_organization.html
安装
在您的根 composer.json 文件中添加以下内容
{ "require": { "wemakecustom/directory-loader-bundle": "^1.0" }, }
并修改您的 app/AppKernel.php
<?php public function registerBundles() { $bundles = array( // ... new WMC\DirectoryLoaderBundle\WMCDirectoryLoaderBundle, ); // ... } protected function getContainerLoader(ContainerInterface $container) { $loader = parent::getContainerLoader($container); $locator = new FileLocator($this); // Add additional loader to the resolver $resolver = $loader->getResolver(); $resolver->addLoader(new DirectoryFileLoader($container, $locator)); return $loader; } ?>
严格来说,注册 Bundle 仅在您需要在路由文件中使用功能时才是必要的,而重载 ContainerLoader 仅对主配置文件是必要的,但您可以根据需要做。
使用方法
此 Bundle 的主要目标是放置配置文件在文件夹中而不修改主 config.yml
。这样,每个文件都可以将所有(且仅)与特定 Bundle 相关的配置分组。
根据环境使用目录
而不是使用 config_ENV.yml
,可以为每个环境使用一个目录。
例如
└── app
├── config
│ ├── common
│ │ └── assetic.yml
│ │ └── framework.yml
│ │ └── security.yml
│ ├── dev
│ │ └── framework.yml
│ │ └── assetic.yml
│ ├── prod
│ │ └── assetic.yml
│ │ └── google_analytics.yml
│ ├── config.yml
│ └── parameters.yml
└── AppKernel.php
<?php // app/AppKernel.php public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config.yml'); $loader->load(__DIR__.'/config/' . $this->getEnvironment() . '/'); } ?>
# app/config/config.yml imports: - { resource: 'parameters.yml' } - { resource: 'common/' }
使用目录来处理参数
参数也可以按相同的方式作为目录加载。
此外,一个有趣的概念是为核心参数(全局适用于您的应用程序)和本地参数(针对每个安装特定)创建文件夹。
例如
└── app
├── config
│ └── …
├── parameters
│ └── common
│ │ └── core.yml
│ │ └── i18n.yml
│ ├── dist
│ │ └── mailer.yml
│ ├── local
│ │ └── .gitignore
│ └── config.yml
└── AppKernel.php
app/parameters/local/*.yml
将被忽略,其内容将是来自 app/parameters/dist
的文件,根据需要进行复制和修改。
然后您可以修改您的 config.yml
# app/config/config.yml imports: - { resource: 'parameters/common/' } - { resource: 'parameters/local/' } - { resource: 'common/' }
使用 composer 脚本生成配置文件
为了在每次 composer 运行时填充缺失的文件,您可以用 wemakecustom/composer-script-utils 替换原生参数构建器,并配置您的 composer.json
,替换 Incenteev\ParameterHandler\ScriptHandler
{ "require": { # ... "wemakecustom/directory-loader-bundle": "^1.0", "wemakecustom/composer-script-utils": "^0.3" }, "scripts": { "post-install-cmd": [ "WMC\\Composer\\Utils\\ConfigFile\\ConfigDir::updateDirs", # remove this: "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters" # ... ], "post-update-cmd": [ "WMC\\Composer\\Utils\\ConfigFile\\ConfigDir::updateDirs", # remove this: "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters" # ... ] }, "extra": { "update-config-dirs": { "app/config/parameters/dist": "app/config/parameters/local" }, # # remove this: # "incenteev-parameters": { # "file": "app/config/parameters.yml" # }, } }
完整示例
您可以在以下位置看到最终的配置树: https://github.com/wemakecustom/symfony-kickstart/tree/master/dist
不使用 Symfony 框架的使用
也可以在不与 Symfony 注册的情况下使用此库。
要这样做,只需将适当的加载器添加到您的 LoaderResolver
中。
带有路由的示例
<?php use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Loader\LoaderResolver; use WMC\DirectoryLoaderBundle\Loader\Routing\DirectoryFileLoader; $locator = new FileLocator($this); $resolver = new LoaderResolver(); // or load yours $resolver->addLoader(new DirectoryFileLoader($locator)); ?>
带有依赖注入(DI)的示例见上方。
注意事项
AsseticBundle 具有一个PHP目录加载器,可以解析控制器。这个目录加载器覆盖了它:如果它尝试执行Assetic加载器的任务,则可以正确工作,但反之则不行。
因此,此包将自己插入到Assetic之前,以确保它首先运行。防止此行为的一种方法是在路由导入中指定 type: directory
,但当前此方法存在一个错误。请参阅 symfony/AsseticBundle#289 和 symfony/symfony#11018。