Docblock Annotations in Doctrine is a really nice way to specify object-relational mapping metadata. But ZF2 also comes with a Zend\Form\Annotation class for specifying field properties on forms. Wouldn’t it be nice if you could combine these two? It turns out you can. Let’s have a look at how easily a Doctrine entity can be turned into a Zend form.
A really nice feature in ZF2 Forms – you can use Doctrine Annotations to create a form. How cool is this? 🙂
use Zend\View\Model\ViewModel;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use DoctrineORMModule\Form\Annotation\AnnotationBuilder;
......
$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
$repository = $entityManager()->getRepository('Admin\Entity\SystemUser');
$id = (int)$this->params()->fromQuery('id');
$user = $repository->find($id);
/* here comes the magic */
$builder = new AnnotationBuilder( $entityManager);
$form = $builder->createForm( $user );
$form->setHydrator(new DoctrineHydrator($entityManager,'Admin\Entity\SystemUser'));
$form->bind($user);
$view = new ViewModel();
$view->setVariable('form',$form);
And on the entity, you add form annotations!
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;
/**
* Application\Entity\SystemUser
*
* @ORM\Table(name="system_user")
* @ORM\Entity(repositoryClass="Admin\Repository\UserRepository")
* @Annotation\Name("user")
*/
class SystemUser implements UserInterface, SoftDeleteInterface
{
/**
* @var integer $userId
*
* @ORM\Column(name="user_id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @Annotation\Attributes({"type":"hidden"})
*/
private $userId;
/**
* @var string $code
*
* @ORM\Column(name="code", type="string", length=255, nullable=true)
* @Annotation\Attributes({"type":"text"})
* @Annotation\Options({"label":"Code:"})
*/
private $code;
/**
* @var string $email
*
* @ORM\Column(name="email", type="string", length=250, nullable=false)
* @Annotation\Type("Zend\Form\Element\Email")
* @Annotation\Options({"label":"Your email address:"})
*/
private $email;
.......
Of course, sometimes you don’t want to allow the user to edit all properties; in these cases you can use @Annotation\Exclude().