妥善解决

Proper solution

我正在为一个工作项目使用 F3(Fat-Free Framework),并且偶然发现了一个我似乎找不到任何相关信息的问题。 Google 和官方 F3 文档都没有给我任何东西。也许我只是问错了问题。问题来了。

我有一个看起来像这样的数组: (城市 => 类型 => 建筑)

$places = array(
    'City A' => array(
        'special' => array(),
        'standard' => array('Campus', ),
    ),
    'City B' => array(
        'special' => array(
            'collect',
            'exam',
            'Brännässlan',
        ),
        'standard' => array(
            'Building A',
            'Building B',
            'Building C',
            'Building D (Library)',
            'Capitol',
            'Flair',
        ),
    ),
),

我想做的是检查数组中的每个建筑物,看看是否为它设置了相应的字典变量。我使用 $f3->exists('dict_select_hus_arrayValue') 进行检查,它工作正常,直到函数遇到其中包含字母 'ä' 的建筑物。如果是,它会抛出 500 错误,文本为 Invalid hive key 'dict_select_hus_Brännässlan'.

我假设它与字符串的编码有关,但我在纯 UTF-8 环境中工作,F3 应该能够处理它。有没有其他人遇到过这个问题,更重要的是,找到了解决问题的方法?

F3 不允许将特定于语言的字符用作配置单元中的键。我不确定这是有意还是无意,但这个问题的根本原因在于 Base class 的 &ref 方法。您会在第 244 行 a preg_match('/^\w+$/',$parts[0]) 附近的某处找到。这将 return false 在您的情况下,因为语言特定字符不在 \w.

我的建议是 change this expression to include chars like the ones you use (you will need to remember about this modification in case you will later upgrade F3 or reset it for some reason) or strip the string 他们中的任何一个,然后再使用 F3 检查。

正如@george007 所发现的那样,确实不允许配置单元键具有特殊字符。但这仅适用于 第一个 配置单元关键段 $part[0]。可以免费使用它更深一层。所以 city.Brännässlan 应该没问题。只需将您的城市和词典条目放入更深层次即可。即:

$f3->set('places',$places);

语言文件:

dict.select_hus.Brännässlan = XY
dict.select_hus.Kairo = YZ

php:

foreach ($f3->get('places') as $c_name => $city) {
  if ($f3->exists('dict.select_hus.'.$c_name)) {
    // it's there
  }
}

来自 http://fatfreeframework.com/base#set

的一个 NB

Remember: Hive keys are case-sensitive. Furthermore, root hive keys are checked for validity against these allowed chars: [ a-z A-Z 0-9 _ ]