sexta-feira, 31 de julho de 2015

CRUD no Zend Framework 2 - Insert

Vamos começar a fazer um crud (inserir, selecionar, alterar e excluir registros do banco de dados) com zend framework 2 utilizando o doctrine 2.

Vamos seguir os passos abaixo para aprendermos como cadastrar um registro no banco de dados:

01 - Registrar a rota na action do formulário que deverá chamar o controller e action para o cadastro.

Então vamos abrir nosso arquivo .phtml localizado em module/Administrador/view/administrador/administrador/index/index.phtml, deixando a action assim:

$form->setAttribute('action', $this->url('adm-insert'));

02 - Em module/Administrador/config/module.config.php, vamos adicionar uma nova rota do tipo literal:

'adm-insert' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/adm-insert',
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'insert',
                    ),
                ),

            ),

03 - O nosso controller deverá conter a action responsável por instanciar o serviceManager e enviar os dados vindo do formulário ao service para então serem inseridos no banco de dados.

Vamos acessar o diretório module/Administrador/src/Administrador/Controller/AdministradorController.php
public function insertAction() {

        //verificando se a requisão é via POST
        if ($this->getRequest()->isPost()) {

            //convertendo dados recebido via POST em array
            $data = $this->getRequest()->getPost()->toArray();

            //localizando o service manager do módulo
            $serviceAdm = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');

            //chamando o método responsavel pela inserção e verificando se não retorna nulo
            if (is_null($serviceAdm->insert($data))) {

                //caso volte nulo (cadastro realizado com sucesso) gera uma mensagem
                $this->flashMessenger()->addSuccessMessage('Cadastrado com sucesso.');
            } else {

                //caso não volte nulo (erro ao cadastrar) gera uma mensagem de erro
                $this->flashMessenger()->addErrorMessage('Erro ao cadastrar.');
            }

            //redirecionando para a página inicial
            return $this->redirect()->toRoute('adm-home');

        }

    }

04 - Devemos criar a classe service e já declarar o método responsavel por tratar e incluir os registros no banco de dados. Nossa classe AdministradorService deverá ser criada em module/Administrador/src/Administrador/Service/ e deverá ficar da seguinte forma:

<?php

namespace Administrador\Service;

use Doctrine\ORM\EntityManager;
use Administrador\Entity\Administradoras AdministradorEntity;

use Zend\Stdlib\Hydrator;

class AdministradorService {

    private $em;
    private $entity = 'Administrador\Entity\Administrador';

    public function __construct(EntityManager $em) {
        $this->em = $em;
    }

    public function insert(Array $data = array()) {
        $entity = new AdministradorEntity();

        //o doctrine espera receber um objeto para inserir-lo no banco de dados
        //então criamos um método para converter um array em objeto
        $obj = $this->toObject($data, $entity);

        $this->em->persist($obj);
        return $this->em->flush();
    }    

    private function toObject(Array $data, $entity) {
        return (new Hydrator\ClassMethods())->hydrate($data, $entity);

    }  


}

05 - Devemos registrar nosso serviço no arquivo Module.php localizado na root do nosso Modulo.

O primeiro passo é chamar a classe de serviço :

use Administrador\Service\AdministradorService;

Agora podemos declara o método getServiceConfig:

public function getServiceConfig() {
        return array(
            'factories' => array(
                'Administrador\Service\AdministradorService' => function($sm) {
                    $em = $sm->get('Doctrine\ORM\EntityManager');
                    return new AdministradorService($em);
                },
            )
        );

    }

Nenhum comentário:

Postar um comentário