Нужно ли абстрагировать код обработки формы? (Zend_Form) - PullRequest
4 голосов
/ 18 ноября 2009

В руководствах Zend Frameworks я вижу код обработки форм, например

if ($request->isPost()) {
            $formData = $request->getPost();

            $code = $request->getParam("code");
            $url = $request->getParam("url");

            if ($form->isValid($formData)) {
            // here goes code to determine insert/update action, 
            //retrive record data
            //and perform relative database operation  

Этот код повторяется для многих форм. Я пытаюсь сделать обработку форм лучше, но не перегружать ее. До сих пор я переместил этот код из контроллеров в объект формы. Но код все еще дублирует для различных типов форм.

У меня такой вопрос: следует ли мне предпочитать, чтобы код обработки форм дублировал, или написать какой-нибудь метод ProcessSubmit () Zend_Form, который будет использоваться всеми подклассами? У меня был опыт, что абстракция не всегда хороша, и иногда вы заканчиваете синхронизацией двух классов, которые отличались от начала.

Примеры ZF демонстрируют дублированный код, поэтому мне интересно, оправдана ли эта двойственность (по крайней мере, для небольших сайтов 3-4 форм) или ее следует избегать любыми способами.

P.S. Эта задача кажется довольно распространенной, мне интересно, если я выполняю двойную работу, и уже есть класс ZF для обработки форм, специфичных для CRUD.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Возможно, помощник действий мог бы, ну, помочь вам здесь:

class App_Controller_Action_Helper_ProcessFormSubmit extends Zend_Controller_Action_Helper_Abstract
{
    public function isValid(Zend_Form $form)
    {
        if ($this->getRequest()->isPost()) {
            return $form->isValid($this->getRequest()->getPost());
        } else {
            return false;
        }        
    }

    public function direct(Zend_Form $form)
    {
        return $this->isValid($form);
    }

}

Это позволяет вам обрабатывать отправку формы следующим образом:

// or: if ($this->_helper->processFormSubmit->isValid($form)) {
if ($this->_helper->processFormSubmit($form)) {
    // here goes code to determine insert/update action, 
    //retrive record data
    //and perform relative database operation
}

Это может быть расширено для ваших нужд, например, автоматическая обработка ошибок и так далее ...

1 голос
/ 18 ноября 2009

Что я на самом деле сделал, так это перенес валидацию в доменные объекты (или уровень модели), а затем в моем доменном слое реализован метод save ().

Хотя я не использую Zend_Form в своем доменном слое, я заметил, что другие будут реализовывать экземпляр Zend_Form в своих доменных моделях, чтобы они могли представлять согласованную форму везде для каждой доменной модели. Лично я чувствую, что это слишком сильно связывает доменные объекты с уровнем представления.

Вместо этого я использую Zend_Filter_Input в качестве основы для проверки в моих объектах домена.

0 голосов
/ 18 ноября 2009

Если вы хотите использовать «тонкие контроллеры / толстые модели» после проверки формы, просто передайте всю форму или значения формы вашей модели.

Что касается управляющих структур в вашем контроллере, то они "нормальные".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...