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:
- Doctrine 1.2: checkout do branch
- Zend Framwork 1.9.1: download do pacote completo
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:
- Adler Medrado – Mudanças no Zend_Loader
- Eric Leclerc – Doctrine ORM and Zend Framework
- Matthew Weier O’Phinney (DevZone) – Developing a Comprehensive Autoloader
- Matthew Weier O’Phinney (Phly, boy, phly) – Autoloading Doctrine and Doctrine entities from Zend Framework
- Ruben Vermeersch – Integrating Zend Framework and Doctrine
- Zend Framework Programmer’s Reference Guide – The Autoloader
Posts relacionados:
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?
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-dbpara 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.
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:
onde c:\caminho\ é o diretório onde está o php.exe
Willian, era isso mesmo, consegui rodar o doctrine. Valeu
Como faço para inserir em loop dados na tabela, alterar e deletar todos os dados da tabela de uma só vez com doctrine?
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…