2011-04-24 92 views
1

经过多次阅读,我意识到Zend_Form可以分为各种表示形式,它很适合作为模型。从Doctrine实体构建Zend_Form的元素

遵循Matthew Weier O'Phinney提出的逻辑,我想到了将Doctrine [2] Entitie传递给扩展Zend_Form的类的构造函数,在这种情况下,App_Form。

所以在我entitie,我有一个方法为每个表单,下面的模式:

protected function _formFormName{}() 

是Entitie扩展抽象类App_Form_Entitie,有一个方法来检索形式:

final public function getForm($form = null) 

并仍然有方法isValid()getMessage()

但很多人宁愿留在单独的文件形式,请参阅:

Where to place Zend_Forms, Controller? Model? Somewhere else?

我不知道其中哪些是最好的方法:通过实体的形式的构造函数作为第一个参数,以及所需的形式,如可选的第二个参数,或从实体获取表单(如Matthew所述),并将第一个参数作为所需表单的名称传递。

欢迎任何答案。

这里是展示两个例子怎么会,2个码,我的建议:

<?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; 
+0

你可能会详细说明这两个选项的一段代码? – rojoca 2011-04-25 14:55:22

+0

@rojoca我加了个例子。 – JCM 2011-04-25 20:11:57

回答

3

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 
+0

好吧,下面的示例中,在我的Entitie中,我有受保护的方法_formLogin(),它返回一个包含表单信息的数组,在这种情况下是正确的用法,因为我没有创建表单本身的对象,只是有创建它所需的数据。对? – JCM 2011-04-25 21:46:29

+0

该方法必须是公开的,否则您如何访问它?我不相信你需要这样一种方法。在'App_Form_Login'中,您将可以访问可以获取/设置值的'User'对象。你还需要从'用户'? – rojoca 2011-04-25 22:01:40

+0

你为什么要尝试让用户实体描述表单...不是表单的用途? – Cobby 2011-04-26 03:22:56