Zend_Form можно просматривать в разных точках.Он вообще не может рассматриваться как часть одного слоя шаблона MVC.
Прежде всего Zend_Form использует декораторы и помощники вида для визуализации формы, на данный момент это часть уровня представления.Затем Zend_Form выполняет часть работы по фильтрации модели и проверяет содержимое.
Мы знаем, что слой Controller отображает входные данные из представления и передает их в модель.На самом деле, уровень контроллера решает, какой ресурс загрузить с уровня модели, а затем выполнить корректирующие вызовы.
Когда вы вызываете Zend_Form из уровня контроллера, вы можете считать, что вы вызываете один ресурс модели для выполнения проверок и действий по фильтрациии решить, является ли это действительным вводом.Например:
public function newAction()
{
$form = $this->getForm();
if($this->getRequest()->isPost())
{
$formData = $this->_request->getPost();
if($form->isValid($formData))
{
$Model = $this->getModel();
$id = $Model->insert($form->getValues());
}
}
$this->view->form = $form;
}
Привязка форм к модели может считаться хорошей практикой, поскольку при выполнении действий по фильтрации и проверке вы находитесь на уровне модели.Итак, как предложил Мэтью:
class Model_DbTable_Users extends Zend_Db_Table
{
protected $_name = 'users';
protected $_form;
public function getForm()
{
if(!$this->_form)
$this->_form = new Form_User();
return $this->_form;
}
public function add($data)
{
$form = $this->getForm();
if(!$form->isValid($data)) return false;
if($form->getValue('id'))
{
$id = (int) $form->getValue('id');
$this->update($form->getValues(), 'id =' . $id);
}
else
{
$id = $this->insert($form->getValues());
}
return $id;
}
}
Из стандартной структуры каталогов мы можем видеть, что формы не находятся ни в папке модели, ни в папке представления, поскольку Zend_Form - это определенный класс, который связывает много ресурсов и слоев вместе.,Если вы проверите сообщение Мэтьюса, вы поймете, что это именно то, что говорится, когда URL-адрес действия установлен в сценарии представления и форма привязана к модели.
Наконец, вы можете проанализировать свой контекст и выбрать один из этих двух подходов.
В настоящее время я выбираю привязку форм к моделям.Выглядит хорошо!И имеет для меня большой смысл.