我有一个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
);
}
}
Run Code Online (Sandbox Code Playgroud)
加载器或多或少都像这样使用(简化了一下,因为还有缓存):
$loaderResolver = new LoaderResolver(array(new YamlProfileLoader($locator)));
$delegatingLoader = new DelegatingLoader($loaderResolver);
foreach ($yamlProfileFiles as $yamlProfileFile) {
$profileName = basename($yamlProfileFile, '.yml');
$profiles[$profileName] = $delegatingLoader->load($yamlProfileFile);
}
Run Code Online (Sandbox Code Playgroud)
它解析的Yaml文件也是如此:
# profiles/germany.yml
locale: de_DE
hostname: %profiles.germany.host_name%
Run Code Online (Sandbox Code Playgroud)
目前,结果数组包含字面上'%profiles.germany.host_name%'
的'hostname'
数组键.
那么,如何解析%参数以获取实际参数值?
我一直在浏览Symfony 2代码和文档(这个SO问题,无法在框架内找到这样做的地方.我可以编写自己的参数解析器 - 从内核中获取参数,搜索%foo%字符串和查找/替换...但如果有一个组件准备好使用,我更喜欢使用它.
为了给出更多背景知识,为什么我不能将它包含在主config.yml中:我希望能够加载app/config/profiles/*.yml
,*
配置文件名称在哪里,我使用自己的Loader来完成此任务.如果有一种通配符导入配置文件的方法,那么这对我也有用.
注意:目前正在使用2.4但只是准备升级到2.5,如果这有帮助.
我尝试了很多选项来将%parameter%解析为parameters.yml,但根本没有运气。我能想到的就是解析 %parameter% 并从容器中获取它,还没有创新。
另一方面,我没有足够的有关您的环境的信息来了解全局,但我只是想出了另一个想法。如果您在parameters.yml 文件中声明您的配置文件并通过容器将其作为数组加载到控制器或服务中,这会非常方便。
应用程序/配置/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
Run Code Online (Sandbox Code Playgroud)
您可以将所有配置文件作为控制器中的数组。
<?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');
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法
如果我正确地回答了你的问题,这个方法可以帮助你。
归档时间: |
|
查看次数: |
1258 次 |
最近记录: |