No post sobre Zend Form eu dei um panorama geral da utilização do componente, mas alguns detalhes tiveram de ser separados em conteúdos à parte. Este é o caso da injeção de dependência no form.
# No form namespace Application\Form; use Doctrine\ORM\EntityManager; use User\Entity\Role; // supondo que esta entidade existe use Zend\Form\Element\Select; use Zend\Form\Form; class UserForm extends Form { public function __construct($name = null, array $options = []) { // lançando excessão para caso o entityManager não esteja presente if (! isset($options['entityManager'])) { throw new \Exception('É preciso passar o EntityManager'); } parent::__construct($name, $options); /** @var EntityManager $entityManager */ $entityManager = $options['entityManager']; // recupera todos os roles do banco de dados $roleCollection = $entityManager->getRepository(Role::class)->findAll(); // inicia o array para as opções do select $roles = []; foreach ($roleCollection as $role) { // adiciona cada um dos roles para o select $roles[$role->getId()] = $role->getName(); } $this->add([ 'name' => 'role', 'type' => Select::class, 'options' => [ 'label' => 'Role', // e por fim define os roles no elemento do form 'value_options' => $roles, 'empty_option' => 'Select a role' ], 'attributes' => [ 'class' => 'form-control ', 'id' => 'role' ] ]); } } # No controller $form = new \Application\Form\UserForm('user', $entityManager);Perceba que espera-se o EntityManager para que possamos realizar a consulta para trazer todos os roles registrados no banco de dados. Porém, apesar de termos resolvido a dependência, não foi uma solução elegante, além de tudo, perigosa. Isso porque nossa classe de form tem conhecimento de algo que não deveria. Nela pode ser utilizado o EntityManager como quiser! Podem ser localizados dados no banco, adicionados, editados e até removidos. E é com base nisso que temos a segunda e melhor implementação da injeção de dependência.
namespace Application\Form; use Zend\Form\Element\Select; use Zend\Form\Form; class UserForm extends Form { public function __construct($name = null, array $options = []) { if (! isset($options['roles'])) { throw new \Exception('É preciso passar a lista de roles'); } parent::__construct($name, $options); $this->add([ 'name' => 'role', 'type' => Select::class, 'options' => [ 'label' => 'Role', 'value_options' => $options['roles'], 'empty_option' => 'Select a role' ], 'attributes' => [ 'class' => 'form-control ', 'id' => 'role' ] ]); } }
# module/Application/src/Module.php public function getServiceConfig() { return [ 'factories' => [ //... \Application\Form\UserForm::class => function (ServiceManager $serviceManager) { $entityManager = $serviceManager->get(\Doctrine\ORM\EntityManager::class); $roles = []; $rolesCollection = $entityManager->getRepository(\User\Form\Role::class)->findAll(); foreach ($rolesCollection as $role) { $roles[$role->getId()] = $role->getName(); } return new \Application\Form\UserForm('user', ['roles' => $roles]); } ] ]; }
$form = $this->getServiceManager()->get(\Application\Form\UserForm::class);Simples não?