Отображение доменной модели в Zend-форму - PullRequest
1 голос
/ 24 февраля 2011

У меня есть Модель предметной области и Форма, и мне всегда было сложно сопоставлять одно с другим.Мне никогда не нравилось передавать экземпляр сопоставителя в форму.

Имеет ли смысл создавать преобразователь форм, который использует преобразователь модели домена для установки значений по умолчанию?Или я должен создать метод в форме, который принимает DomainModel, который устанавливает значения по умолчанию?

Недостатком варианта 1 является то, что FormMapper имеет зависимость от DomainModelMapper, а недостатком варианта 2 является то, что контроллер становится толще.

class DomainModel
{
    function toArray() {}
}

class DomainModelMapper
{
    function findById($id)
    {
        return new DomainModel($id);
    }
}

FormMapper использует DomainModelMapper для заполнения MyForm.

class MyForm extends Zend_Form
{

}

class FormMapper
{
    function getFormById($id)
    {
        $mapper = new DomainModelMapper();
        $domainModel = $mapper->findById($id);

        $form = new MyForm();
        $form->setDefaults($domainModel->toArray());

        return $form;
    }
}

1 Ответ

1 голос
/ 24 февраля 2011

Почему бы вам не попробовать сделать это в файле вашего контроллера. Ведь вы собираетесь отобразить форму

public function someAction()
{

    $mapper = new DomainModelMapper();
    $domainModel = $mapper->findById($id);

    $form = new MyForm();
    $form->populate($domainModel->toArray());
    $this->view->form = $form;
}

Я думаю, что вы можете сделать это и с вашим view.phtml файлом.

Я не совсем уверен в вашем требовании. Но то, что я делаю в zf, выглядит примерно так и довольно легко и сложно.

  1. Назовите все поля формы в соответствии с полями таблицы базы данных, например, если у меня есть таблица с полями f1, f2, f3, .., тогда мои имена элементов формы будут f1, f2, f3, ..

  2. Поэтому, когда я получаю базу данных формы через Db_Model, тогда я заполняю, используя $form->populate($dbmodel->toArray()) при редактировании.

  3. При вставке или обновлении я получаю форму массива. first remove all non-db fields like submit buttom, затем then $data = $form->getValues() и $dbmodel->udpate($data, 'where condition')

Я совсем не уверен, решу ли я вашу проблему, но Zend, безусловно, облегчает мою работу с несколькими неприятными неприятными препятствиями, поэтому я не использую никакой базы данных (по крайней мере, с Zend).

...