0

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

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 语句的行。如果我打印出正在评估的变量,我会看到它已经(错误地)用 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)跳过一些加载或配置过程,从而导致字符串被错误处理。任何帮助将不胜感激,谢谢

4

1 回答 1

0

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

于 2012-08-02T20:12:34.120 回答