segunda-feira, 31 de agosto de 2015

Inslatar o Zend Framework 2 "sem" o composer.phar

Esses dias fui instalar o zend framework 2 fazendo o clone pelo git como sempre fiz e percebi que o pacote não tinha o arquivo composer.phrar. Pesquisando na internet consegui encontrar a solução.

Segue abaixo o passo-a-passo da instalação (linux/mac):

1 - Vá até o diretório desejado
cd /var/www/html/


2 - Criar pasta do projeto
mkdir zf2teste


3 - Baixar o composer.phrar
curl -s https://getcomposer.org/installer | php --


4 - Instalar o Zend Framework 2 no diretório desejado
php composer.phar create-project --stability="dev" zendframework/skeleton-application zf2teste

5 - Mover o arquivo composer.phrar para a pasta do projeto, para futuras atualizações
mv composer.phar /zf2teste

6 - Iniciando o servidor emputido
cd zf2teste/public
php -S localhost:8888

7 - Para testar se a instalação está correta, abra o navegador e acesse:
http://localhost:8888

8 - Para instalar o doctrine 2, vá na pasta root do zend framework onde está o arquivo composer.phrar e digite o seguinte comando:
php composer.phar require doctrine/doctrine-orm-module

Mais informações:

http://framework.zend.com/manual/current/en/ref/installation.html

https://github.com/zendframework/ZendSkeletonApplication

https://github.com/doctrine/DoctrineORMModule

sexta-feira, 14 de agosto de 2015

Sessions no Zend Framework 2

Existem diversos modos de utilizarmos as sessões no Zend Framework 2, vamos aprender um dos modos mais simples que é usando a classe Container.

segue abaixo um exemplo de como utilizar:


01 - criando a sessão e setando valores

use Zend\Session\Container;

$sessionContainer = new Container('admin_auth');
$sessionContainer->usuario_id = $data->getAdminId();
$sessionContainer->usuario_email = $data->getAdminEmail();

02 - Recuperando os dados setados na sessão

$sessionContainer = new Container('admin_auth');
$serviceLog = $this->getServiceLocator()->get('Usuario\Service\AdminLogService');

return $serviceLog->insert(array('admin_id' => $sessionContainer->admin_id, 'admin_data' => date('Y-m-d')));

Mais informações:

http://framework.zend.com/manual/current/en/modules/zend.session.container.html

quarta-feira, 12 de agosto de 2015

FlashMessager no Zend Framework 2

O Zend Framework 2 possui um componente chamado FlashMessager que nos ajuda a mostrar mensagens nas views.

Segue um exemplo de como utilizar esse recurso:

01 - Na classe de controller:

public function deleteAction($id){
     
     $service = $this->getServiceLocator()->get('Administrador\Service\');

     if($service->delete($id)){
          $this->flashMessenger()->addSuccessMessage('Excluído com sucesso.');
     }
     else{
          $this->flashMessenger()->addErrorMessage('Erro ao excluir.');
     }

     return $this->redirect()->toRoute('adm-home');

}

02 - Na view

<?php
     
     echo $this->flashMessenger()->renderCurrent('success', array('alert', 'alert-success'));
     echo $this->flashMessenger()->renderCurrent('error', array('alert', 'alert-danger'));

?>

Mais informações:

http://framework.zend.com/manual/current/en/modules/zend.view.helpers.flash-messenger.html

http://framework.zend.com/apidoc/2.2/classes/Zend.Mvc.Controller.Plugin.FlashMessenger.html

segunda-feira, 10 de agosto de 2015

Hydrator - Zend Framework 2

O Hydrator é um componente do Zend Framework 2 que nos ajuda a transformar um objeto em array e um array em objeto.

Segue um exemplo de como usa-lo na sua classe de serviço:

<?php

namespace Administrador\Service;

use Zend\Stdlib\Hydrator\ClassMethods;

class AdministradorService{

private function toArray($obj) {        
$classMethod = new ClassMethods();        
       return $classMethod->extract($obj);
}
   
private function toObject(Array $data, $entity) {        
$classMethod = new ClassMethods();        
return $classMethod->hydrate($data, $entity);
}

}

?>

Mais informações:

http://framework.zend.com/manual/current/en/modules/zend.stdlib.hydrator.html

http://framework.zend.com/manual/current/en/modules/zend.stdlib.hydrator.strategy.html

sexta-feira, 31 de julho de 2015

CRUD no Zend Framework 2 - Delete

A última parte do crud é o delete. Vamos ver como excluir um registro do banco de dados usando o Zend Framework2 e o Doctrine 2.

01 - A rota para acessar o controller deve ser Segment pois iremos passa o id do registro pela url. Vamos acessar module/Administrador/config/module.config.php e adicionar a rota:

'adm-delete' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/administrador/delete[/:id]',
                    'constraints' => array(
                        'id' => '\d+'
                    ),
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'delete',
                    ),
                )

            ),

02 - O controller deve conter o método deleteAction para enviar os dados a classe de serviços: A classe AdministradorController está localizada em: module/Administrador/src/Administrador/Controller/

public function deleteAction() {

        //pegando o parâmetro da rota
        $admId = $this->params()->fromRoute('id', 0);

        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');
        $delete = $admService ->delete($admId);
        if (is_null($delete)) {
            $this->flashMessenger()->addSuccessMessage('Excluído com sucesso.');
        } else {
            $this->flashMessenger()->addErrorMessage('Erro ao excluir.');
        }
        return $this->redirect()->toRoute('adm-home');

    }

03 - A classe de serviço recebe o id do registro recupera os dados do registro no banco de dados e então exclui o mesmo. Em module/Administrador/src/Administrador/Service/ podemos encontrar a classe AdministardorService:

public function delete($id) {
        $entity = $this->em->getReference($this->entity, $id);
        if ($entity) {
            $this->em->remove($entity);
            return $this->em->flush();
        } else {
            return false;
        }

    }

CRUD no Zend Framework 2 - Update

O processo de alteração de registros no banco de dados é sempre o mais burocrático, pois antes de fazer todo o processo de alteração temos de recuperar o registro que queremos alterar. Vamos ver como fazer estes dois processo com usando o Zend Framework 2 e o Doctrine 2.

01 - A rota é o primeiro passo. Temos que criar duas rotas uma para carregar o formulário com os dados vindo do banco de dados (update) e outra para enviar os dados ao banco de dados (edit). Vamos acessar module/Administrador/config/module.config.php.


'adm-edit' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/adm/edit',
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'edit',
                    ),
                ),
            ),
'carro-update' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/adm/update[/:id]',
                    'constraints' => array(
                        'id' => '\d+'
                    ),
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'update',
                    ),
                )
            ),

02 - Vamos criar os métodos no controller. A classe do controller fica em module/Administrador/src/Administrador/Controller/AdministradorController.php

public function editAction() {
        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost()->toArray();
            $up = $admService ->update($data);
            if (is_null($up)) {
                $this->flashMessenger()->addSuccessMessage('Alterado com sucesso.');
            } else {
                $this->flashMessenger()->addErrorMessage('Erro ao alterar.');
            }
            return $this->redirect()->toRoute('adm-home');
        } 
    }

    public function updateAction(){
        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');
        $admId = $this->params()->fromRoute('id', 0);
        $data['form'] = $admService ->popForm($admId);
        return new ViewModel($data);
    }

03 - Vamos acessar a nossa classe de serviços para criarmos três métodos: um para recuperar os dados do registro do banco de dados, um para popular o formulário com o registro recuperado e o último para efetuar a alteração dos registros. A classe de serviços do módulo está localizada em module/Administrador/src/Administrador/Service/AdministradorService.php

use Carro\Form\CarroForm;

public function getById($adm_id) {
        $admRepository = $this->em->getRepository('Administrador\Entity\Administrador');
        return $admRepository ->get(array('adm_id' => $adm_id));
    }    
    
    //populando o formulario (alterar)
    public function popForm($id){       
        $administrador= $this->getById($id);        
        $array = $this->toArray($administrador);        
        $form = new AdministardorForm();       
        $form->populateValues($array);        
        return $form;
    }
    
    public function update(Array $data){
        $entity = $this->em->getReference($this->entity, $data['adm_id']);
        $obj = $this->toObject($data, $entity);
        $this->em->persist($obj);
        return $this->em->flush();

    }

04 - A nossa classe de repository precisa de mais um método get() onde passamos um array com as condições que queremos fazer a busca (where).

//pegando os registros pelos parametros passados
public function get($where=array()){      
    return $this->findOneBy($where);

}

05 -  O último é acessar module/Administrador/view/administrador/administrador/ e criar o arquivo update.phtml

<?php
$form = $this->form;
$form->setAttribute('action', $this->url('adm-edit'));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formCollection($form);
echo $this->form()->closeTag();

CRUD no Zend Framework 2 - Select

Vamos utilizar o Repository do Doctrine 2 para recuperar os registros do banco de dados no Zend Framework 2.

Segue abaixo o passo-a-passo:

01 - Vamos adicionar a rota em module/config/module.config.php:

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

            ),

02 - No controller iremos criar o método responsável por recebemos os dados da classe de serviços e enviarmos a view. Então acessando module/Administrador/src/Administrador/Controller/AdministradorController.php:

public function selectAction() {

        //instanciando a classe de serviços
        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');  
      
        //recuperando os registros do banco de dados
        $data['administradores'] = $admService ->getAll();

        //retornando os dados para a view
        return new ViewModel($data);


    }

03 - Na classe de serviços do módulo temos que fazer a conexão com o Repository da entidade. A classe está em module/Administrador/src/Administrador/Service:

Vamos adicionar a chamada da classe EntityManager do Doctrine:
use Doctrine\ORM\EntityManager;


Então criar o método para se conectar com o repository e retornar os registros ao controller:
public function getAll() {
        $admRepository = $this->em->getRepository('Administrador\Entity\Administrador');
        return $admRepository ->get();

}

04 - Vamos acessar o diretório module/Administrador/src/Administrador/Entity para criarmos o método get();

//pegando os registros pelos parâmetros passados
public function get(){      
     return $this->findAll();

}

05 - Vamos criar o arquivo select.phtml em module/Administrador/view/administrador/administrador/ para exibirmos os registros:

<table class="table table-condensed table-hover table-striped">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>Nome</th>
                        <th>E-mail</th>                        
                    </tr>
                </thead>
                <tbody>
                    <?php
                    foreach ($administradores as $adm) {                   
                        
                        echo
                        "<tr>
                            <td>{$adm->getAdministradorId()}</td> 
                            <td>{$adm->getAdministradorNome()}</td>
                            <td>{$adm->getAdministradorEmail()}</td>
                        </tr>";
                    }
                    ?>
                </tbody>

            </table>