Zend Framework 2 Tips: Usando Doctrine em testes unitários

Posted on março 14, 2013. Filed under: PHP, Tips, Zend Framework | Tags:, , , |

Introdução

Neste artigo vamos aprender como instanciar o Entity Manager do Doctrine nas classes de teste unitário no Zend Framework 2. Se você usa Doctrine no seu projeto, é bem provável que algumas classes que precisará testar possuem a dependência do Entity Manager. É sobre isso que trata esse artigo.

Caso necessário, em artigo anterior, já vimos como instalar os módulos Doctrine, ZFTool e Firephp no Zend Framework 2.

Registrando os módulos do Doctrine no Config de testes

Se você criou seu módulo do Zend Framework através do ZFTool provavelmente foi criado uma pasta chamada test/ dentro do diretório pai do seu módulo. No caso de exemplo do módulo Application, que já vem instalado no esqueleto inicial do projeto, o caminho ficaria: module/Application/test/.

O primeiro passo é registrar os módulos do Doctrine dentro do arquivo TestConfig.php.dist que esta dentro do diretório test/ do seu módulo:

<?php
// module/Application/test/TestConfig.php.dist
return array(
    'modules' => array(
        'Application',
        'DoctrineModule',
        'DoctrineORMModule'
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            '../../../config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            'module',
            'vendor',
        ),
    ),
);

Bootstrap

Existe um arquivo chamado Bootstrap.php dentro do diretório test/ do seu módulo. Esse arquivo é responsável por inicializar todos os parâmetros necessários para que você possa trabalhar com testes unitários no Zend Framework.

Vamos criar dentro do arquivo Bootstrap.php um método estático que será responsável por retornar o Entity Manager do Doctrine. É através deste método que vamos acessar o Entity Manager em nossos testes:

<?php
// module/Application/test/Bootstrap.php
..
    public static function getEntityManager()
    {
    	$sm = static::getServiceManager();
    	return $sm->get('doctrine.entitymanager.orm_default');
    }
    
}

Bootstrap::init();

Acessando o Entity Manager

Por final, vamos acessar o Entity Manager dentro de nossas classes de teste. Podemos estar testando um Controller, um Model ou qualquer outro componente. Basta chamarmos o método estático Bootstrap::getEntityManager();.

Não se esqueça de usar o namespace do Bootstrap no início do seu script:

<?php
// module/Application/test/ApplicationTest/Model/AlbumTest.php
namespace ApplicationTest\Model;
use ApplicationTest\Bootstrap;
//.... setUp, etc.

public function testAlbum()
{
	$em = Bootstrap::getEntityManager();
	$album = new Album($em);
}
Ler Post Completo | Make a Comment ( None so far )

Instalando Zend Framework 2 com ZFTool, FirePhp e Doctrine

Posted on março 9, 2013. Filed under: PHP, Zend Framework | Tags:, , , , , |

Introdução

Neste artigo vamos demonstrar como instalar o esqueleto do Zend Framework 2 junto com os componentes ZFTool, FirePhp e Doctrine. Vou focar mais na instalação dos componentes. Instalar o esqueleto do Zend Framework é simples e pode ser feito através do link citado mais abaixo.

Entendo os componentes

ZFTool é uma ferramenta usada para facilitar a gerencia de projetos do Zend Framework. Pode ser usado para criar/excluir módulos, criar novas aplicações do zend framework ou simplesmente instalar o diretório library do zend framework.

O módulo do FirePHP para Zend Framework, permite que você envie informações de log diretamente para a extensão FirePHP do Firefox. Muito útil para debugar sua aplicação ZF2.

O Doctrine fornece diversas bibliotecas com foco em persistência de dados. Seus principais projetos desenvolvidos são um Object Relational Mapper (ORM) e um Database Abstraction Layer. Você pode usar ele junto com o Zend Framework 2. Um alternativa ao Zend\Db.

Lembre-se que a instalação de cada um desses componentes é feita de forma independente. Portanto, caso queira instalar apenas 1 ou de 2 desses componentes e não todos, é possível fazer sem preocupações.

Instalando o Esqueleto do Zend Framework

Aconselho usar o link abaixo para instalação inicial do zend framework. É uma referência oficial que estará sempre atualizada.
http://zf2.readthedocs.org/en/latest/user-guide/skeleton-application.html

Instalando e usando o ZFTool

Instalar o ZFTool é bem simples. Basta entrar no diretório raiz da sua aplicação do Zend Framework e executar:

$ php composer.phar require zendframework/zftool:dev-master
composer.json has been updated
Loading composer repositories with package information
Updating dependencies
  - Installing zendframework/zftool (dev-master 7bdb1bc)
    Cloning 7bdb1bcec331d995c800287b0dca614b62b701cc

Writing lock file
Generating autoload files

Usando o zftool

Para usar o zftool, copie o arquivo zf.php para a raiz da aplicação do zend framework. Dessa forma:

$ cp vendor/bin/zf.php ./

Algumas funcionalidades do ZFTool:

  • Listando módulos
  • $ ./zf.php modules
    Modules installed:
    Application
    
  • Criando módulos
  • $ ./zf.php create module Admin
    The module Admin has been created
    
    $ ./zf.php modules
    Modules installed:
    Application
    Admin
    
  • Referência completa
  • Mais funcionalidades sobre o ZFTool, acessar:
    https://github.com/zendframework/ZFTool

Instalando e usando o FirePHP

Para instalar o FirePHP, basta executar o comando abaixo na raiz do diretório do projeto do zend framework:

$ php composer.phar require firephp/firephp-core:dev-master
composer.json has been updated
Loading composer repositories with package information
Updating dependencies
  - Installing firephp/firephp-core (dev-master f60753a)
    Cloning f60753a8dd7817e4da6bc73e0e717387a9a0866a

Writing lock file
Generating autoload files

Usando o FirePHP

Para utilizar a classe de logger do Firephp, vamos primeiro criar um factory para ela no arquivo Module.php do nosso módulo. O factory deve ser criado dentro da função getServiceConfig().

No caso, estamos trabalhando com o módulo Application:

(Se necessário, caso não exista ainda, criar a função getServiceConfig() dentro de Module.php)

// module/Application/Module.php
public function getServiceConfig() {
	return array(
		'factories' => array(
			'Zend\Log\FirePhp' => function($sm) {
				$writer_firebug = new \Zend\Log\Writer\FirePhp();
				$logger = new \Zend\Log\Logger();
				$logger->addWriter($writer_firebug);
				return $logger;
			},
		),
	);
}

Exemplo de utilização do Firephp no Controller:

// module/Application/src/Application/Controller/IndexController.php
public function indexAction()
{
	$firephp = $this->getServiceLocator()->get('Zend\Log\FirePhp');
	$firephp->info("info log");
	$firephp->warn("warn log");
	$firephp->crit("critical log");

	return new ViewModel();
}

Lembre-se que para funcionar corretamente, você precisa instalar a extensão firephp no seu Mozilla Firefox:
http://www.firephp.org/

Resultado do teste anterior:

ScreenShot082

Mais detalhes, consultar a documentação do ZF:
http://framework.zend.com/manual/2.0/en/modules/zend.log.overview.html#using-built-in-priorities
http://framework.zend.com/manual/2.0/en/modules/zend.log.writers.html

Instalando e usando o Doctrine

Para instalar o Doctrine, executar o comando abaixo no diretório raiz da sua aplicação Zend:

$ php composer.phar require doctrine/doctrine-orm-module:dev-master
composer.json has been updated
Loading composer repositories with package information
Updating dependencies
  - Installing doctrine/common (2.3.0)
    Downloading: 100%

  - Installing symfony/console (v2.2.0)
    Downloading: 100%

  - Installing doctrine/doctrine-module (0.7.1)
    Loading from cache

  - Installing doctrine/dbal (2.3.2)
    Downloading: 100%

  - Installing doctrine/orm (2.3.2)
    Downloading: 100%

  - Installing doctrine/doctrine-orm-module (dev-master 8da0dab)
    Cloning 8da0dab03be4f282b97632d54979d6b45d6bf479

doctrine/doctrine-module suggests installing doctrine/data-fixtures (Data Fixtures if you want to generate test data or bootstrap data for your deployments)
doctrine/orm suggests installing symfony/yaml (If you want to use YAML Metadata Mapping Driver)
doctrine/doctrine-orm-module suggests installing zendframework/zend-developer-tools (zend-developer-tools if you want to profile operations executed by the ORM during development)
doctrine/doctrine-orm-module suggests installing doctrine/migrations (doctrine migrations if you want to keep your schema definitions versioned)
Writing lock file
Generating autoload files

Usando o Doctrine no ZF2

O primeiro passo é registrar os módulos e namespaces do doctrine no zf. Edite o arquivo APP_DIR/config/application.config.php e adicione as linhas responsáveis por registrarem os módulos do Doctrine:

return array(
    'modules' => array(
        'Application',
         outros modulos..
        'DoctrineModule',
        'DoctrineORMModule',        
        ),
        mais configs...

Depois configure os dados de conexão com o banco de dados que será utilizado pelo Doctrine. Crie um arquivo dentro de APP_DIR/config/autoload. No meu caso, criei o arquivo APP_DIR/config/autoload/doctrine_orm.local.php, parametrizando os dados de acesso ao banco de dados. Veja abaixo, que configurei uma conexão com o postgresql. Com um pouco de ajuste você pode modificar para mysql caso desejado:

<?php
// config/autoload/doctrine_orm.local.php
return array(
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOPgSql\Driver',
                'params' => array(
                    'host'     => 'localhost',
                    'port'     => '5432',
                    'user'     => 'userdatabase',
                    'password' => 'senhadatabase',
                    'dbname'   => 'nomedatabase',
                )
            )
        )
    ),
);

Finalmente para podermos utilizar o Doctrine dentro de nosso módulo do Zend Framework precisamos de alguns ajustes no arquivo module.config.php que fica dentro do diretório config/ do módulo. Em nosso caso, em module/Application/config! Lembre-se de trocar o Application pelo nome do módulo no qual esta trabalhando.

Insira as linhas destacadas abaixo no arquivo module.config.php:

<?php
// module/Application/config/module.config.php
namespace Application;

return array(
  'router' => array(
    ...
  ),
  'controllers' => array(
    ...
  ),
  'view_manager' => array(
    ...
  ),
  'doctrine' => array(
    'driver' => array(
      __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
      ),
      'orm_default' => array(
        'drivers' => array(
          __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
        )
      )
    )
  )
);

Veja que foi necessário incluir a linha namespace no começo do arquivo, devido estamos usando a constante __NAMESPACE__ na configuração para o Doctrine. Isso facilita nosso trabalho, deixando o código desta configuração mais dinâmico um pouco.

Com essa configuração o Doctrine vai passar a procurar os arquivos Entity dentro de NomedoModulo/src/NomedoModulo/Entity. Basta criar o diretório Entity no caminho correto e dentro dele o arquivos que representam as entidades do seu banco de dados. Após essa configuração, você já esta apto à utilizar o Doctrine junto com o Zend Framework 2.

No nosso caso o caminho do diretório Entity ficaria em module/Application/src/Application/Entity.

Arquivo composer.json final

Após a instalação das 3 bibliotecas, ZFTool, FirePhp e Doctrine, nosso arquivo composer.json do Zend Framework ficou da seguinte forma:
(Destaquei apenas as linhas que foram inseridas devido a instalação das bibliotecas)

{
    "name": "zendframework/skeleton-application",
    "description": "Skeleton Application for ZF2",
    "license": "BSD-3-Clause",
    "keywords": [
        "framework",
        "zf2"
    ],
    "homepage": "http://framework.zend.com/",
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": "2.*",
        "zendframework/zftool": "dev-master",
        "firephp/firephp-core": "dev-master",
        "doctrine/doctrine-orm-module": "dev-master"
    }
}

Parabéns
Se você chegou até aqui e conseguiu configurar e instalar os módulos desejados na sua aplicação Zend Framework, Parabéns!

Referências

Selecionei alguns links que podem ser úteis referente ao assunto deste artigo:

https://github.com/zendframework/ZFTool
http://samminds.com/2012/07/install-doctrine-2-for-zend-framework-2/
http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/
http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html
http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html
http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html
http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html

Ler Post Completo | Make a Comment ( None so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: