关于在何处放置全局辅助函数的OOP / MVC建议

时间:2010-05-11 09:58:15

标签: php model-view-controller oop

我的网站上有几个处理表单数据的控制器。表单使用AJAX,我在不同的控制器上有很多方法,它们必须做一些特定的处理才能以JSON编码格式返回错误 - 参见下面的代码。显然这不是DRY,我需要将此代码移动到一个我可以全局使用的单个辅助函数中,但我想知道它应该在哪里实际发生!我应该创建一个包含此函数的静态帮助器类(例如Validation :: build_ajax_errors()),或者这个代码生成一个特定于应用程序并与我正在使用的jQuery验证插件绑定的格式,如果它是静态的例如,存储在我的主网站控制器中的方法,表单处理控制器从哪里扩展?

               //if ajax request, output errors
                if (request::is_ajax())
                {
                    //need to build errors into array form for javascript validation - move this into a helper method accessible globally
                    $errors = $post->errors('form_data/form_error_messages');

                    $i = 0;
                    $new_errors  = array();
                    foreach ($errors as $key => $value)
                    {
                        $new_errors[$i][0] = '#' . $key;
                        $new_errors[$i][1] = $value;
                        $new_errors[$i][2] = "error";
                        $i++;
                    }

                    echo '{"jsonValidateReturn":' . json_encode($new_errors) . '}'; 

                    return;
                }

1 个答案:

答案 0 :(得分:2)

恕我直言,你的问题归结为个人编程风格的问题。当我确定一段需要重构的代码以符合DRY主体时,我并不总是以同样的方式重构它。

如果我理解正确,您需要在表单类中使用此函数/方法,并且所有这些表单类都扩展相同的基本表单类。在这种情况下,我会将有问题的方法推广到超类中(我知道你提到你希望这个方法在全局范围内可用),但是你的其他用例似乎暗示函数/方法只是用于表单类。)。

当我实际拥有一个我需要在整个应用程序中使用的辅助函数时(我确定没有其他地方可以放置它),我将它放在应用程序的入口点。使用Zend Framework的MVC,该入口点将是公共index.php(所有请求都通过index.php路由,使其成为全局函数的逻辑位置)。在该文件的底部,我总是添加一些帮助函数,以便在调试时节省一些输入。请参阅“The most useful function you will ever use . . .”作为示例。