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
  3. Surviving the deep end

This entry was posted in Artigos and tagged , , , . Bookmark the permalink.

7 Responses to Integrando o Doctrine com o Zend Framework

  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 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.

    • 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

  3. Marcus says:

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

  4. 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?

  5. Milton says:

    Revivendo o post…rsrs…

    Galera estou querendo colocar o doctrine no include path do php.ini …
    Tipo com fiz com zend-tools…
    Pra rodar o zf-Command Line Interface na linha de comando …

    Tem jeito… Alguem aí já fez isso …
    doctrine – Command Line Interface . . . Pelo que eu andei vendo, terei que criar um ShellScript…

    Me da 1 help aí . . .
    Flws…

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">