Zend_Form / MVC, где должна проходить подготовка и обработка формы? - PullRequest
1 голос
/ 07 апреля 2011

У меня в настоящее время есть код в моем контроллере, который извлекает 3 типа сущностей из БД, чтобы заполнить 3 поля выбора.Контроллер также берет на себя ответственность за вызов метода проверки объектов формы, и в случае успеха он создает и устанавливает свойства объекта из входных данных формы и вызывает преобразователь данных для его сохранения.У меня такое ощущение, что мой контроллер слишком толстый.Любые предложения о том, где я должен поместить мою форму подготовки и обработки кода?Должен ли я переместить его в объект формы?Спасибо заранее за ваше время!

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Возможно, вы захотите взглянуть на Использование Zend_Form в ваших моделях от Мэтью Вейера О'Пинни.Он объясняет, как перенести такую ​​логику с вашего контроллера в модель.

1 голос
/ 07 апреля 2011

Я предпочитаю помещать обработку формы в саму форму.Поэтому я создаю метод process () в форме, чтобы вы могли хранить всю логику формы в объекте формы.

Например, в вашем контроллере:

$form = myForumClass();
...
$form.process();
0 голосов
/ 08 апреля 2011

Для таблиц вашей базы данных вы должны создавать модели - они должны содержать логику для получения и установки данных в эту таблицу. Таким образом, в этом случае модель должна отвечать за получение массива значений, который затем передается в контроллер, а затем в форму.

class MyModel 
{
    public function getSelectArray()
    {
        //Get stuff from Db here and format into an array ready to add to the form
    }
}

Затем вы можете сделать это в вашем контроллере

$model =  new MyModel();

$element->addMultiOptions($model->getSelectArray());

Вы также можете создать специальный класс формы, который расширяет Zend_Form, затем он может быть вызван из любого контроллера и возвращать ту же форму - что позволяет легко повторно использовать форму где угодно - например, Вы можете использовать ту же форму на странице регистрации, что и на странице «Мой профиль».

В качестве примера ниже приведена функция из моей модели, которая делает именно это:

public function getSelectArray()
{
    $select = $this->select()->order(array("name ASC"));

    $categories = $select->query()->fetchAll();

    $return = array();

    foreach($categories as $category)
        $return[$category['id']] = $category['name'];

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