由于错误的字符串编码,CakePHP Cakemenu插件在全局错误后失败

时间:2012-08-02 15:35:17

标签: cakephp character-encoding eval

我正在使用带有PHP 5.3.5的CakePHP 2.1.2和一个名为'Cakemenu'的插件,它通常可以正常工作。该插件将菜单存储在db表中,菜单链接存储为文本,如

array('plugin'=>null,'controller'=>'assets','action'=>'index');

插件中的助手获取这些值,然后执行此代码将该文本转换为数组:

    //Try to evaluate the link (if starts with array)
    if (eregi('^array', $value['Menu']['link'])) {
      $code = "\$parse = " . $value['Menu']['link'] . ";";
      $result = eval($code);
      if (is_array($parse)) {
        $value['Menu']['link'] = $parse;
      }
    }

除非CakePHP处理错误,否则一切正常。例如,如果我在浏览器中输错了控制器的名称,我应该得到一个菜单,然后是丢失的控制器消息。相反,我得到一个完整的页面“解析错误:语法错误,意外的$ end in ...”消息指向带有eval语句的行。如果我打印出正在获得eval的变量,我会发现它已经(错误地)编码了Html实体,但通常没有。

要评估的好字符串:

 $parse = array('plugin'=>null,'controller'=>'assets','action'=>'index');

要评估的错误字符串:

 $parse = array('plugin'=>null,'controller'=>'Parts','action'=>'add');

要暂时解决问题,我添加了两个语句来替换有问题的字符

    $value['Menu']['link'] = str_replace( ''','\'',$value['Menu']['link']);
    $value['Menu']['link'] = str_replace( '>','>',$value['Menu']['link']);

一切都很好。可能有用的其他一些信息是,用于生成菜单的数据数组在应用程序的beforeFilter期间被读取并保存在视图变量中,然后菜单将作为视图中的元素生成。

我认为该错误导致CakePHP(或PHP)跳过某些加载或配置过程,导致字符串处理不当。任何帮助将不胜感激,谢谢

1 个答案:

答案 0 :(得分:0)

您的beforeFilter()方法不会在错误页面上执行。您必须自己处理错误并手动调用beforeFilter()。我写了一篇关于如何使用自定义错误页面的blog post - 密切注意控制器回调部分。