Integrando o Doctrine com o Zend Framework

Ontem tive um certo trabalho em fazer o Doctrine se integrar ao Zend Framework. Após várias tentativas e erros, além de buscas na web, encontrei o tutorial de Eric Leclerc, que faz uma atualização do tutorial de Ruben Vermeersch, para utilizar o Doctrine com o Zend Framework versão 1.8 ou superior.

As versões que utilizei para minha integração:


Utilizarei o nome de “seuProjeto” para exemplificar o diretório raíz. Ao utilizar o Zend_Tool, ele cria uma estrutura de diretório padrão. Depois de criar um novo projeto, faça as seguintes alterações:

Crie o diretório do Doctrine no diretório seuProjeto/library/Doctrine:

mkdir seuProjeto/library/Doctrine

Dentro desse diretório ficará o arquivo Doctrine.php e mais uma pasta chamada Doctrine:

seuProjeto/library/Doctrine/Doctrine.php
seuProjeto/library/Doctrine/Doctrine/

Crie os seguintes diretórios:

mkdir seuProjeto/application/doctrine/
mkdir seuProjeto/application/doctrine/data/
mkdir seuProjeto/application/doctrine/data/fixtures/
mkdir seuProjeto/application/doctrine/data/sql/
mkdir seuProjeto/application/doctrine/migrations/
mkdir seuProjeto/application/doctrine/schema/

Adicione as linhas abaixo ao arquivo seuProjeto/application/configs/application.ini na seção [production]:

doctrine.connection_string = "mysql://usuario:senha@host/db"
doctrine.data_fixtures_path = APPLICATION_PATH "/doctrine/data/fixtures"
doctrine.models_path = APPLICATION_PATH "/models"
doctrine.migrations_path = APPLICATION_PATH "/doctrine/migrations"
doctrine.sql_path = APPLICATION_PATH "/doctrine/data/sql"
doctrine.yaml_schema_path = APPLICATION_PATH "/doctrine/schema"

Edite o arquivo seuProjeto/application/Bootstrap.php, adicionando o método _initDoctrine():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function _initDoctrine()
{
  require_once 'Doctrine.php';
  $loader = Zend_Loader_Autoloader::getInstance();
  $loader->pushAutoloader(array('Doctrine', 'autoload'));
  $doctrineConfig = $this->getOption('doctrine');
  $manager = Doctrine_Manager::getInstance();
 
  $manager->setAttribute(
    Doctrine::ATTR_MODEL_LOADING,
    Doctrine::MODEL_LOADING_CONSERVATIVE
  );
 
  Doctrine::loadModels($doctrineConfig['models_path']);
  $manager->openConnection($doctrineConfig['connection_string']);
  return $manager;
}

Agora basta editar o arquivo seuProjeto/public/index.php, alterando o set_include_path para que fique parecido com isso:

set_include_path(implode(PATH_SEPARATOR, array(
  realpath(APPLICATION_PATH . '/../library'),
  realpath(APPLICATION_PATH . '/../library/Doctrine'),
  realpath(APPLICATION_PATH . '/models'),
  realpath(APPLICATION_PATH . '/models/generated'),
  get_include_path(),
)));

Feito tudo isso, pode acessar seuProjeto utilizando os models gerados pelo Doctrine.

Se você tiver algum problema ao instanciar um model, experimente adicionar a linha 5 (abaixo) no método _initDoctrine() do arquivo seuProjeto/application/Bootstrap.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function _initDoctrine()
{
  require_once 'Doctrine.php';
  $loader = Zend_Loader_Autoloader::getInstance();
  $loader->setFallbackAutoloader(true);
  $loader->pushAutoloader(array('Doctrine', 'autoload'));
  $doctrineConfig = $this->getOption('doctrine');
  $manager = Doctrine_Manager::getInstance();
 
  $manager->setAttribute(
    Doctrine::ATTR_MODEL_LOADING,
    Doctrine::MODEL_LOADING_CONSERVATIVE
  );
 
  Doctrine::loadModels($doctrineConfig['models_path']);
  $manager->openConnection($doctrineConfig['connection_string']);
  return $manager;
}

Se ocorrer erro de não classes do Doctrine, ou novamente models, confira se não esqueceu algum diretório na função set_include_path do arquivo seuProjeto/public/index.php.

Links úteis:

Posts relacionados:

  1. Contribua com o Doctrine
  2. SVN:Externals – recursos externos em seus projetos

  1. Marcus says:

    Como faço para gerar os modelos? Eu já li que é pelos comandos que são executados pelo script shell, mas como é o passo a passo para executar esse script shell?

  2. Marcus, neste post do Eric Leclerc você encontrará o caminho das pedras. Depois de criar o arquivo doctrine-cli, basta executá-lo no shell para verificar quais são os parâmetros aceitos. Por exemplo:

    ./doctrine-cli generate-models-db

    para gerar seus models a partir do seu banco de dados. Vale a pena dar uma olhada nesse tutorial (Doctrine Command Line Interface), do Raphael Almeida Araújo do PHPMS.

  3. Marcus says:

    Willian, valeu pela ajuda.

    Esse comando ./doctrine-cli é aceito pelo windows? Porque eu estou tentando executar esse comando, que também tem no exemplo do site oficial, e o DOS não está aceitando.

  4. Marcus, para funcionar no Windows, remova a primeira linha do script. Depois disso, estando na mesma pasta do arquivo doctrine-cli, execute-o da seguinte forma:

    c:\caminho\php.exe doctrine-cli

    onde c:\caminho\ é o diretório onde está o php.exe

  5. Marcus says:

    Willian, era isso mesmo, consegui rodar o doctrine. Valeu

  6. Marcus says:

    Como faço para inserir em loop dados na tabela, alterar e deletar todos os dados da tabela de uma só vez com doctrine?

  1. There are no trackbacks for this post yet.

Leave a Reply

CAPTCHA image