我正在使用带有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)跳过某些加载或配置过程,导致字符串处理不当。任何帮助将不胜感激,谢谢
答案 0 :(得分:0)
您的beforeFilter()
方法不会在错误页面上执行。您必须自己处理错误并手动调用beforeFilter()
。我写了一篇关于如何使用自定义错误页面的blog post - 密切注意控制器回调部分。