2010-05-11 2 views
3

У меня есть несколько контроллеров на моем сайте, которые обрабатывают данные формы. Формы используют AJAX, и у меня есть несколько методов для разных контроллеров, которым приходится выполнять определенную обработку для возврата ошибок в кодированном формате JSON - см. Код ниже. Очевидно, что это не СУХОЙ, и мне нужно переместить этот код в одну вспомогательную функцию, которую я могу использовать глобально, но мне интересно, куда это должно идти! Должен ли я создать статический вспомогательный класс, который содержит эту функцию (например, Validation :: build_ajax_errors()), или поскольку этот код создает формат, который является специфичным для приложения и связанным с плагином проверки jQuery, который я использую, должен ли он быть статическим метод, хранящийся, например, в моем основном контроллере сайта, от которого распространяются контроллеры обработки формы?Рекомендации OOP/MVC о том, где разместить глобальную вспомогательную функцию

   //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; 
       } 

ответ

2

ИМХО, ваш вопрос сводится к вопросу личного стиля программирования. Когда я определил фрагмент кода, который нужно реорганизовать, чтобы он соответствовал основному сухую, я не всегда реорганизую его таким же образом.

Если я правильно понял, вам нужна эта функция/метод в ваших классах форм, и все эти классы форм расширяют один и тот же базовый класс формы. В этом случае я бы продвинул этот метод в суперкласс (я знаю, что вы упомянули, что хотите, чтобы этот метод был доступен «глобально», но остальная часть вашего прецедента показала, что функция/метод будет только используется в ваших классах форм.).

Когда у меня действительно есть вспомогательная функция, которая мне нужна во всем приложении (и я уверен, что ее больше нет), я помещаю ее в точку входа приложения. Используя MVC Zend Framework, эта точка входа будет публичной index.php (все запросы направляются через index.php, что делает ее логическим местом для глобальных функций). В нижней части этого файла я всегда добавляю некоторые вспомогательные функции, чтобы сохранить себя во время отладки. См. «The most useful function you will ever use . . .» в качестве примера.

+0

Привет, Джереми, вы правы в отношении «глобальной» природы функции, она имеет значение только для классов классов. Суперкласс - фактически главный контроллер веб-сайта, который расширяется не только классами форм, но и рядом других классов. Теперь, глядя на мой код, я, вероятно, должен иметь общий контроллер класса формы, расширяющий мой контроллер веб-сайта и расширяемый конкретными контроллерами на основе форм. Есть определенные кусочки и кусочки, которые повторно используются всеми моими формами, поэтому они должны быть действительно реорганизованы в общий контроллер формы, который был бы хорошим местом для моей функции. – franko75

+0

CodeIgniter использует «помощников», которые являются в основном функциональными библиотеками, которые вы можете использовать загружать по желанию. Функции переходят в глобальную область и могут быть вызваны из любой точки при загрузке. –

Смежные вопросы