【发布时间】:2016-06-05 08:27:02
【问题描述】:
我想解析任意 .yml 文件的内容并修改任意键。
让我们获取 security.yml 文件,获取其内容并使用 Yaml::parse,它将返回一个包含其结构的数组数组。
$yml='/config/security.yml';
$path = $this->get('kernel')->getRootDir().$yml;
$contents= Yaml::parse(file_get_contents($file));
这个输出
array(1) {
["security"]=>
array(5) {
["encoders"]=>
string(8) "Array(1)"
["role_hierarchy"]=>
string(8) "Array(3)"
["providers"]=>
string(8) "Array(2)"
["firewalls"]=>
string(8) "Array(2)"
["access_control"]=>
string(9) "Array(14)"
}
}
到目前为止一切顺利。现在假设我想更改security.firewalls.main.pattern 的值。我需要更改数组值 $contents['security']['firewalls']['main']['pattern'] 然后 file_put_contents yaml 转储。
我的问题是如何通过任意键动态获取和设置参数值,而不是像上面那样硬编码。 Yaml 解析器无法通过其键获取值。我需要一种方法以某种方式将security.firewalls.main.pattern 转换为数组键。很明显,我之后会删除缓存。
我同时做了一些东西:
$array = Yaml::parse(file_get_contents($file));
$keys=array("security","firewalls","main");
$val = $this->parseYmlArray($array, $keys);
public function parseYmlArray($array, $keys)
{
$newArr = $array;
foreach ($keys as $key) {
$newArr = $newArr[$key];
}
return $newArr;
}
这将返回任何节点,但它需要一个与键深度完全相同的数组。
我最初在考虑是否可以制作一个 ParameterBag 就像容器中的那个一样。问题是我似乎无法找到从深度关联数组到 key->value (例如security.firewalls.main.pattern 及其值)的创建位置。如果我尝试从数组中创建一个 ParameterBag,它不会修改该数组,该包包含完全相同的数组。我正在尝试查找数组在哪里被解析并转换为容器中的那个。
【问题讨论】:
-
可能值得研究,也许我可以重构我上面的函数。