六月
24
2016

symfony ParameterBag::resolveValue() 方法的用途

说明

symfony 中参数包 ParameterBagresolveValue() 方法是个很常用的方法。

当然,我这里所谓的常用是指 symfony 系统内部,对于那些不在意 symfony 内部代码的朋友们,此处可以忽略了。

该方法很常用,Hy369 本身也觉得比较重要且时间一长就容易迷糊,所以特地记录在自己的 PHP 博客中。

方法解释

既然这里提到了 ParameterBag::resolveValue() 方法,那么就无法绕开 ParameterBag::get()ParameterBag::resolveString() 方法了,因为这几个方法是紧密关联的。所以 ParameterBag::get()ParameterBag::resolveString() 功能也会在这里一并记录。

ParameterBag::get($name)

参数:

$name 需要获取的参数的名称

函数作用:

通过提供的参数名称,从 ParameterBag::parameters 参数包的参数属性中取得对应的值。

这里要特别提到一个功能,代码片段如下:

            $alternatives = array();
            foreach ($this->parameters as $key => $parameterValue) {
                $lev = levenshtein($name, $key);
                if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
                    $alternatives[] = $key;
                }
            }

这段代码在对应的参数名称不存在时,会遍历所有已经存在的参数,通过 levenshtein() 函数进行参数比较,从而筛选出比较相近的参数名称,然后在接下来抛出的异常中给出可能值的提示。不得不说,这是一个让我惊叹的代码,哈哈。

ParameterBag::resolveValue($value, array $resolving = array())

参数:

  • $value 需要进行解析的值,数组和字符串值会进行解析,其它值直接返回传递的值

  • $resolving 为已经解析过的字符串的集合,该参数用于避免死循环解析

函数作用:

  • 数组类型的值则对该数组进行遍历,然后对数组的键与值均进行 ParameterBag::resolveValue() 递归解析

  • 非数组非字符串类型的值,直接返回本身

  • 字符串值调用 ParameterBag::resolveString() 方法进行字符串解析

ParameterBag::resolveString($value, array $resolving = array())

参数:

  • $value 是需要进行解析的字符串

  • $resolving 为已经解析过的字符串的集合,该参数用于避免死循环解析

函数作用:

  • 匹配符合正则 /^%([^%\s]+)%$/ 的字符串,也就是匹配类似 %name% 格式的字符串,如果匹配成功:

    • 如果匹配到的 name$resolving 参数中存在对应的键,则说明出现了死循环解析,此时抛出异常

    • 反之,说明可正常进行解析,在将 namearray(name => true) 的形式录入 $resolving 参数中后,通过 ParameterBag::get() 方法取得对应的值。

    • 接下来有个小的分支,若是 ParameterBag::resolved 属性为真,则不对取得的值进行再解析;若属性为假,则继续对取得的值进行再解析
  • 然后将能够匹配正则 /%%|%([^%\s]+)%/ 的字符串,类似 %%%name% 的字符串进行处理后,返回处理后的结果

    • 如果匹配到的字符串为 %%,表明这是一个 % 符号的转义形式,此时直接返回 %%

    • 检测是否死循环解析,即检查 $resolving 参数中是否已经存在对应的键,死循环时抛出异常

    • 获得 name 为名称的参数的值,若参数的值不为字符串或数字,则抛出异常,因为 symfony 本身要求参数必须是字符串或数字

    • 然后判断 ParameterBag::resolved 属性的真假,决定是否进行再解析,最后返回解析后的值

非特殊注明博文为 爱PHP吧(www.iphp8.com)原创内容,转载请注明原文地址:http://www.iphp8.com/?post=90

评论

发表评论:

(选填)

(选填)