Php Symfony 2-如何在我自己的Yaml文件加载器中解析%parameter%?

Php Symfony 2-如何在我自己的Yaml文件加载器中解析%parameter%?,php,symfony,Php,Symfony,我有一个Yaml加载器,它为一个“概要文件”加载额外的配置项(其中一个应用程序可以使用不同的概要文件,例如同一站点的不同本地版本) 我的加载器非常简单: # YamlProfileLoader.php use Symfony\Component\Config\Loader\FileLoader; use Symfony\Component\Yaml\Yaml; class YamlProfileLoader extends FileLoader { public function l

我有一个Yaml加载器,它为一个“概要文件”加载额外的配置项(其中一个应用程序可以使用不同的概要文件,例如同一站点的不同本地版本)

我的加载器非常简单:

# YamlProfileLoader.php

use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Yaml\Yaml;

class YamlProfileLoader extends FileLoader
{
    public function load($resource, $type = null)
    {
        $configValues = Yaml::parse($resource);
        return $configValues;
    }

    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'yml' === pathinfo(
            $resource,
            PATHINFO_EXTENSION
        );
    }
}
加载程序的使用方式大致如下(简化了一点,因为也有缓存):

正在解析的Yaml文件也是如此:

# profiles/germany.yml

locale: de_DE
hostname: %profiles.germany.host_name%
目前,生成的数组包含
'%profiles.dermany.host_name%'
作为
'hostname'
数组键

那么,如何解析%参数以获得实际的参数值呢

我一直在浏览Symfony 2代码和文档(但找不到在框架本身中是在哪里完成的)。我可能会编写自己的参数解析器-从内核获取参数,搜索%foo%字符串并查找/替换…但是如果有一个组件可以使用,我更喜欢使用它

为了提供更多的背景信息,为什么我不能将其包含在主config.yml中:我希望能够加载
app/config/profiles/*.yml
,其中
*
是配置文件名,我正在使用我自己的加载程序来完成这项工作。如果有一种方法可以通配符导入配置文件,那么这可能对我也适用


注意:目前正在使用2.4,但如果有帮助的话,几乎可以升级到2.5。

我尝试了很多选项将%parameter%解析为parameters.yml,但一点运气都没有。我所能想到的就是解析%parameter%并从容器中获取它,还没有创新

另一方面,我没有足够的关于您的环境的信息来了解全局,但我只是想出了另一个想法。如果您在parameters.yml文件中声明您的配置文件,并通过容器将其作为数组加载到控制器或服务中,这将非常方便

app/config/parameters.yml

parameters:
    profiles:
        germany:
            locale: de_DE
            host_name: http://de.example.com
        uk:
            locale: en_EN
            host_name: http://uk.example.com
        turkey:
            locale: tr_TR
            host_name: http://tr.example.com 
您可以在控制器中将所有配置文件作为一个数组

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {


        $profiles = $this->container->getParameter('profiles');
        var_dump($profiles);

        return $this->render('AcmeDemoBundle:Default:index.html.twig');
    }
}

我一直在浏览symfony2的代码和文档(这是一个非常复杂的问题,在框架本身中找不到这是在哪里完成的)

Symfony的依赖项注入组件在优化阶段使用编译器过程来解析参数引用

从其实例获取注册的编译器传递。此类配置,其中包括

在容器编译过程中,
ResolveParameterPlaceHoldersPass
使用容器的来包含
%parameters%
。然后编译器将解析值设置回容器中

那么,如何解析%参数以获得实际的参数值呢

您需要访问ProfileLoader中的容器(或您认为合适的任何地方)。使用容器,您可以递归地迭代解析的yaml配置,并将值传递给容器的参数包,以便通过该方法进行解析


在我看来,也许一种更简洁的方法是在捆绑包配置中实现这一点。这样,您的配置将根据定义的结构进行验证,这样可以尽早捕获配置错误。有关更多信息,请参阅上的文档(该链接适用于v2.7,但希望也适用于您的版本)

我意识到这是一个老问题,但我花了相当长的时间为我自己的项目弄清楚了这一点,所以我把答案贴在这里以供将来参考

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {


        $profiles = $this->container->getParameter('profiles');
        var_dump($profiles);

        return $this->render('AcmeDemoBundle:Default:index.html.twig');
    }
}