Symfony2 - 如何使用Symfony \ Component \ DependencyInjection \ Loader \ ClosureLoader导入参数?

时间:2013-11-28 12:55:24

标签: php symfony configuration dependency-injection closures

我在文档章节 Miscellaneous Configuration 中找到了以下未记录的功能:

  

资源文件可以是多种类型之一。 PHP,XML,YAML,INI和   关闭资源 导入指令

负责加载这些资源的班级似乎是:

  

Symfony \ Component \ DependencyInjection \ Loader \ ClosureLoader( APIdoc Code

根据文档的理解,应该可以使用配置文件中的 PHP闭包导入服务和/或参数。

非工作示例:

# app/config/config.yml
imports:
     # closure? something like eval( <multiline-string> ) ?
    - { resource: >  
                    function($containerBuilder) { 
                        return array( 
                            'parameters' => array(
                                'upload_tmp_dir' => ini_get('upload_tmp_dir')
                            )
                         );
                    } 
    }    

我找不到一个示例,说明如何在带有导入指令的PHP,XML,YAML配置文件中使用此加载器。

  • 是否有使用imports的可用示例?

  • ClosureLoader是否与YAML格式兼容?

有一个示例可以显示如何使用Symfony\Component\Routing\Loader\ClosureLoader加载路径集合( Routes as Closures )。

但它没有说明如何使用带有imports指令的闭包作为文档说明。


我的问题背后的想法是可能可以访问PHP的配置值或config.yml 中的某些类常量而无需创建扩展/编译器 - 以不同的配置格式传递或导入文件。 (即以YAML格式访问常量 not possible )。

这将开辟一些很好的可能性......

...比如添加一个闭包,为upload_tmp_dir中的php.ini路径导入一个参数,然后可以立即在LiipMonitorBundleliip_monitor.checks.writable_directory数组中使用。< / p>

2 个答案:

答案 0 :(得分:0)

我已经能够在AppKernel中使用该加载器:

class AppKernel extends \Symfony\Component\HttpKernel\Kernel
{
    // ...

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load($this->getRootDir() . '/config/config_' . $this->getEnvironment() . '.yml');

        // Load config from the closure
        $loader->load(function () {
           // ..
        });
    }
}

问题是重新计算缓存时没有考虑到这一点(例如,如果更改关闭,缓存不会更改)。

答案 1 :(得分:-1)

要使用ini文件,您可以将文件称为ressource:

- { resource: parameters.ini }

theres 4类型的闭包与symfony dependcyInjection组件(Symfony 2.3)。有IniFileLoader,PhpFileLoader,XmlFileLoader和YamlFileLoader。

要使用个人封口,您应该创建一个延伸自的个人封口 的Symfony \组件\ DependencyInjection \装载机\ FileLoader

这是一个很好的例子:http://www.adayinthelifeof.nl/2013/01/30/custom-symfony2-config-loader/