感谢@Hikaru-Shindo我查看了AnnotationForms
这似乎是最适合ModelForms
的解决方案。但是显示的示例here对我不起作用。
use Zend\Form\Annotation\AnnotationBuilder;
$builder = new AnnotationBuilder();
$form = $builder->createForm('User');
查看此代码,我想知道AnnotationBuilder
知道在哪里查找此用户表单。特别是因为在def形式的注释中有一个小写的“用户”
@Annotation\Name("user")
我将表单def代码放入'MyModule / Form / UserForm.php',将较低的代码放入我的Controller中。这是正确的方法吗?
答案 0 :(得分:8)
这可能是您的实体(和表单定义)的用户实体(短版本):
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation as Form;
/**
* @ORM\Entity
* @ORM\Table(name="application_user")
* @Form\Name("user")
* @Form\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
*/
class User
{
/**
* @var int
* @ORM\Id @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue
* @Form\Exclude()
*/
protected $id;
/**
* @var string
* @ORM\Column(name="user_name", type="string", length=255, nullable=false)
* @Form\Filter({"name":"StringTrim"})
* @Form\Validator({"name":"StringLength", "options":{"min":1, "max":25}})
* @Form\Validator({"name":"Regex", "options":{"pattern":"/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/"}})
* @Form\Attributes({"type":"text"})
* @Form\Options({"label":"Username:"})
*/
protected $username;
/**
* @var string
* @ORM\Column(name="email", type="string", length=90, unique=true)
* @Form\Type("Zend\Form\Element\Email")
* @Form\Options({"label":"Your email address:"})
*/
protected $email;
}
并使用此表格:
use Zend\Form\Annotation\AnnotationBuilder;
$builder = new AnnotationBuilder();
$form = $builder->createForm('Application\Entity\User');
// Also possible:
// $form = $builder->createForm(new Application\Entity\User());
因此构建器需要定义类的完全限定名称。 您使用注释设置的名称是用于创建表单的id属性的表单名称。
如果你有一个use语句,你也可以使用命名空间:
use Zend\Form\Annotation\AnnotationBuilder;
use Application\Entity\User;
$builder = new AnnotationBuilder();
$form = $builder->createForm('User');
// Also possible:
// $form = $builder->createForm(new User());
答案 1 :(得分:3)
有同样的问题。解决方案是一个令人心碎的人。花了我很长时间才发现。 问题在于注释代码的第一行。
/**
此行通常用于注释注释代码,但几乎所有人都将其留空。通常没有问题,但这在某种程度上导致形式注释中的问题。您应该添加一些注释,添加空格或移动第一行代码。所以:
/** Some comment to make this annotation work
/** (<-- a space)
或者像这样开始:
/** @ORM\Column(type="string")
不要问我为什么会这样,在网上找到解决方案。据我所知,这个bug已被报道。