Php Symfony 2-如何在我自己的Yaml文件加载器中解析%parameter%?
我有一个Yaml加载器,它为一个“概要文件”加载额外的配置项(其中一个应用程序可以使用不同的概要文件,例如同一站点的不同本地版本) 我的加载器非常简单: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
# 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');
}
}