wemakecustom/directory-loader-bundle

此包已被废弃且不再维护。未建议替代包。

Symfony DirectoryLoaderBundle 递归导入配置目录

安装: 872

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 6

分支: 1

公开问题: 0

类型:symfony-bundle

v1.0 2016-02-18 19:11 UTC

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