Создание элементов Zend_Form из объекта Doctrine

После долгих прочтений я понял, что Zend_Form можно разделить на различные представления, он хорошо вписывается в представление как модель.

Следуя логике, предложенной Мэтью Вейером О'Финни, у меня возникла идея передать Doctrine[2] Entitie конструктору класса, расширяющего Zend_Form, в данном случае App_Form.

Итак, в моей сущности у меня есть метод для каждой формы, следующий шаблону:

protected function _formFormName{}()

этот Entitie расширяет абстрактный класс App_Form_Entitie, у которого есть метод для получения формы:

final public function getForm($form = null)

и по-прежнему иметь методы isValid() и getMessage().

Но многие предпочитают оставлять формы в отдельных файлах, см.:

Где разместить Zend_Forms, контроллер? Модель? Где-то еще?

Интересно, какой из них является лучшим способом: передать сущность конструктору формы в качестве первого параметра, а желаемую форму - таким, необязательным, вторым параметром, или получить форму из сущности (как описывает Мэтью) и передать в качестве первого параметра имя желаемой формы.

Любой ответ приветствуется.

Вот два кода, показывающие, как будут выглядеть два примера, во-первых, мое предложение:

<?php
//My controller action
/* @var $em Doctrine\ORM\EntityManager */
$user = $em->find('MyNamespace\User', 1);
$loginForm = new App_Form($user, array('form'=> 'login'));
$this->view->loginForm = $loginForm;

//My view script
echo $this->loginForm;

А вот предложение Мэтью, в котором формы находятся в отдельных файлах:

<?php
//My controller action
/* @var $em Doctrine\ORM\EntityManager */
$user = $em->find('MyNamespace\User', 1);
$formLogin = $user->getForm('login'); //The entity creates a new instance of the class App_Form_Login and returns it.
$this->view->formLogin = $formLogin

//In my view...
echo $this->formLogin;

person jonathancardoso    schedule 24.04.2011    source источник
comment
Не могли бы вы рассказать об этих двух вариантах с небольшим количеством кода?   -  person rojoca    schedule 25.04.2011
comment
@rojoca Я добавил примеры.   -  person jonathancardoso    schedule 26.04.2011


Ответы (1)


Кажется неправильным, чтобы сущность User создавала объекты App_Form. Ваши сущности — это идеализированные абстракции ваших данных, на которые вы ссылаетесь в других частях вашего приложения. Это не мешает вам иметь отдельные файлы для ваших типов форм. Я бы выбрал что-то вроде вашего первого варианта:

<?php
//My controller action
/* @var $em Doctrine\ORM\EntityManager */
$user = $em->find('MyNamespace\User', 1);
$loginForm = new App_Form_Login($user);
$this->view->loginForm = $loginForm;

//My view script
echo $this->loginForm
person rojoca    schedule 25.04.2011
comment
Итак, следуя примеру, в моем Entitie у меня есть защищенный метод _formLogin(), который возвращает массив, содержащий информацию о форме, в этом случае это правильное использование, так как я не создаю объект самой формы, просто данные, необходимые для его создания. Правильно? - person jonathancardoso; 26.04.2011
comment
Метод должен быть общедоступным, иначе как вы могли бы получить к нему доступ? Я не уверен, что вам нужен такой метод. В App_Form_Login у вас будет доступ к объекту User, для которого вы можете получить/установить значения. Что еще вам нужно от User? - person rojoca; 26.04.2011
comment
Почему вы пытаетесь получить сущность User для описания формы... разве не для этого предназначена форма? - person Cobby; 26.04.2011
comment
Я использую что-то похожее на предложение rojoca, у меня есть собственный класс формы для каждой формы. - person Cobby; 26.04.2011
comment
У меня есть класс App_Form, который расширяет Zend_Form, и у меня есть методы для получения формы из Entitie, поэтому я использую только App_Form($entitie); - person jonathancardoso; 26.04.2011
comment
@Cobby Я думаю об этом, потому что, на мой взгляд, данные для настройки формы должны находиться на уровне модели шаблона MVC, следовательно, внутри сущности, которая будет использоваться для управления данными из формы. Ах, английский не мой основной язык. Икс] - person jonathancardoso; 26.04.2011
comment
@Jonathan - Просто создайте класс App_Form_Login, который расширяет App_Form, и выполните любую настройку формы в этом классе. Тогда ваш уровень модели (объект пользователя) должен выполнять только пользовательскую логику, а не формировать логику. - person rojoca; 26.04.2011
comment
Спасибо @rojoca, я воспользуюсь тем, что вы сказали. - person jonathancardoso; 29.04.2011